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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:38