You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,其实可以更优雅地实现关联查询,代码可读性和可维护性更高:

  1. 先在Products模型里定义和Category的关联关系:
class Products extends CActiveRecord {
    // ...其他原有代码
    public function relations() {
        return array(
            'category' => array(self::BELONGS_TO, 'Category', 'cid'),
        );
    }
}
  1. 然后控制器里直接用ActiveRecord的关联查询:
public function actionPdtview() {
    // 预加载关联的category数据,避免N+1查询问题
    $models = Products::model()->with('category')->findAll();
    $this->render('pdtview',array('model'=>$models));
}
  1. 视图里可以直接调用关联模型的属性:
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:46:51