Activerecord yii2为每个查找添加where条件模型

Activerecord yii2为每个查找添加where条件模型,activerecord,model,find,yii2,multi-tenant,Activerecord,Model,Find,Yii2,Multi Tenant,在Yii2中,我试图更改ActiveRecord模型,以便每次应用程序运行find()或findAll()时,它也会向条件添加额外的where 例如,应用程序对股票模型调用find()方法: $UsersStockFound = Stock::Find() ->where(['stockActive' => 1]); 所以,这就是我想要实现的,我希望模型在用户看到结果之前添加一个额外的条件。 让我们假设我已经在$this->tenant下存储了tenant ref 所以我想把它添加

在Yii2中,我试图更改ActiveRecord模型,以便每次应用程序运行find()或findAll()时,它也会向条件添加额外的where

例如,应用程序对股票模型调用find()方法:

$UsersStockFound = Stock::Find()
->where(['stockActive' => 1]);
所以,这就是我想要实现的,我希望模型在用户看到结果之前添加一个额外的条件。 让我们假设我已经在$this->tenant下存储了tenant ref 所以我想把它添加到上面的查询中,但是无缝地通过模型

->AddWhere(['tenantId' => $this->tenantId]);
换言之,整个过程就像:

$UsersStockFound = Stock::Find()
->where(['stockActive' => 1]);
->AddWhere(['tenantId' => $this->tenant]);

您只需在模型中重写find()方法:

public static function find()
{
    return parent::find()->where(['storeActive' => 1]);
}

您可以简单地覆盖模型中的find()方法:

public static function find()
{
    return parent::find()->where(['storeActive' => 1]);
}

以上任何操作都无效。。全球地。。如果使用我们保存在override find中的内容将不起作用。。下面是最好的方法

class model extends \yii\db\ActiveRecord
{

    public static function find()
    {

        return new CustomActiveRecordQuery(get_called_class());
    }

}
class CustomActiveRecordQuery extends ActiveQuery
{
    // ...
        public function prepare($builder)
    {
            $this->andWhere(['status' => 'Active']);
            return parent::prepare($builder);
    }
}

没有什么比这更有效的了。。全球地。。如果使用我们保存在override find中的内容将不起作用。。下面是最好的方法

class model extends \yii\db\ActiveRecord
{

    public static function find()
    {

        return new CustomActiveRecordQuery(get_called_class());
    }

}
class CustomActiveRecordQuery extends ActiveQuery
{
    // ...
        public function prepare($builder)
    {
            $this->andWhere(['status' => 'Active']);
            return parent::prepare($builder);
    }
}

这是否也会影响FindAll,或者我需要将其覆盖到?@MarkJohnson。只需在查询中添加
all()
,否则必须覆盖
findAll()
。因为两者都是不同的方法。谢谢大家的帮助@烧酒。谢谢发现它有问题,如果我使用Stock::Find()->All(),它似乎忽略了->where(['storeActive'=>1]),这是否也会影响FindAll,或者我是否需要将其覆盖到?@MarkJohnson。只需在查询中添加
all()
,否则必须覆盖
findAll()
。因为两者都是不同的方法。谢谢大家的帮助@烧酒。谢谢发现它有问题,如果我使用Stock::Find()->All(),它似乎忽略了->where(['storeActive'=>1])