Yii框架关联查询结果渲染视图时出现Illegal string offset 'id'错误
解决Yii中关联查询结果渲染到视图的报错问题
嘿,这个问题的根源一眼就能看出来啦!你在控制器里用了queryRow()方法,这个方法只会返回单一条记录的一维数组,但你在视图里却用foreach去遍历它——这就相当于把数组里的每个字符串(比如"Flowers")当成循环的每一项,然后试图去取它的['id']偏移量,自然就会抛出Illegal string offsets 'id'的错误啦。
解决方案1:改用queryAll()获取所有记录
把控制器里的queryRow()替换成queryAll(),这个方法会返回符合条件的所有记录组成的二维数组,这样视图里的foreach就能正常遍历每一行数据了:
修改后的控制器代码:
public function actionPdtview() { $model=new Products; $models=Products::model()->findAll(); // 把queryRow()改成queryAll() $rows = Yii::app()->db->createCommand() ->select('category.ctg,category.cid, products.*') ->from('category') ->join('products','category.cid = products.cid') ->queryAll(); // 这里是关键修改 $this->render('pdtview',array('model'=>$rows)); }
你的视图代码不需要改动,现在$model是二维数组,foreach遍历的每一项$row就是单条记录的关联数组,就能正常取出$row['id']、$row['ctg']这些值了。
解决方案2:用Yii ActiveRecord关联查询(更符合框架规范)
既然你用的是Yii的ActiveRecord,其实可以更优雅地实现关联查询,代码可读性和可维护性更高:
- 先在
Products模型里定义和Category的关联关系:
class Products extends CActiveRecord { // ...其他原有代码 public function relations() { return array( 'category' => array(self::BELONGS_TO, 'Category', 'cid'), ); } }
- 然后控制器里直接用ActiveRecord的关联查询:
public function actionPdtview() { // 预加载关联的category数据,避免N+1查询问题 $models = Products::model()->with('category')->findAll(); $this->render('pdtview',array('model'=>$models)); }
- 视图里可以直接调用关联模型的属性:
<table> <tr> <th>sl.no</th> <th>Category</th> <th>Product</th> </tr> <?php $i=1; foreach($model as $row) { ?> <tr> <td><?php echo $i++; ?></td> <td><?php echo $row->category->ctg; ?></td> <td><?php echo $row->pdt; ?></td> </tr> <?php } ?> </table>
这种方式完全贴合Yii的开发规范,后续维护起来也更方便。
内容的提问来源于stack exchange,提问作者josmi joseph
相关产品推荐
相关产品推荐

