自定义ActiveRecord类在视图调用find()方法时无法正常工作
重写ActiveRecord find方法后视图调用出现异常问题
我在项目里重写了基础ActiveRecord类的find()方法,想全局给所有查询加上company_id的过滤条件,之前运行都正常,但现在在视图里调用自定义的Order类(继承自这个自定义ActiveRecord)的find()方法时,突然抛出异常了。
相关代码片段
自定义的基础ActiveRecord类:
namespace common\components; use Yii; use yii\db\ActiveRecord as BaseActiveRecord; class ActiveRecord extends BaseActiveRecord{ public static function find() { return parent::find() ->where(['=', static::tableName().'.company_id', Yii::$app->user->identity->company_id]) ->andWhere(['=', static::tableName().'.status', 1]); // 补全截断的条件示例 } }
继承该类的Order模型:
class Order extends \common\components\ActiveRecord { // 模型其他业务代码 }
可能的问题原因及解决方案
我帮你梳理几个最可能触发异常的点:
未登录场景下的空指针问题:你的
find()方法直接调用了Yii::$app->user->identity->company_id,如果视图在用户未登录时被访问(比如公共页面、登录跳转前的页面),Yii::$app->user->identity会是null,调用->company_id就会直接抛出致命错误。
修复方案:在方法里增加登录判断:public static function find() { $query = parent::find(); // 仅当用户已登录且身份信息存在时,才添加全局过滤条件 if (!Yii::$app->user->isGuest && Yii::$app->user->identity) { $query->where(['=', static::tableName().'.company_id', Yii::$app->user->identity->company_id]) ->andWhere(['=', static::tableName().'.status', 1]); } return $query; }子类未正确实现
tableName():如果Order类没有重写tableName()方法,或者返回的表名格式错误,拼接.company_id时会导致SQL语法错误,触发查询异常。
修复方案:确保所有继承自自定义ActiveRecord的子类都正确实现该方法:class Order extends \common\components\ActiveRecord { public static function tableName() { return '{{%order}}'; // 替换为你的实际表名,Yii的表名前缀写法 } }视图中查询调用方式错误:如果视图里直接输出
Order::find()而没有执行查询(比如没加one()/all()),当PHP尝试把查询对象转为字符串时,会触发SQL预解析,此时如果前面的条件有问题,就会抛出异常。
修复方案:视图里调用时确保完成查询操作,比如:<?php $order = Order::find()->one(); echo $order ? $order->order_sn : '无订单'; ?>
内容的提问来源于stack exchange,提问作者rajwa766
相关产品推荐
相关产品推荐

