Activerecord yii2为每个查找添加where条件模型
在Yii2中,我试图更改ActiveRecord模型,以便每次应用程序运行find()或findAll()时,它也会向条件添加额外的where 例如,应用程序对股票模型调用find()方法: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 所以我想把它添加
$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])