Yii2:ActiveQuery 示例以及在 Gii 中单独生成 ActiveQuery 类的原因是啥?

Posted

技术标签:

【中文标题】Yii2:ActiveQuery 示例以及在 Gii 中单独生成 ActiveQuery 类的原因是啥?【英文标题】:Yii2 : ActiveQuery Example and what is the reason to generate ActiveQuery class separately in Gii?Yii2:ActiveQuery 示例以及在 Gii 中单独生成 ActiveQuery 类的原因是什么? 【发布时间】:2015-11-04 02:24:45 【问题描述】:

您能否提供一个示例用法。描述将不胜感激。我找不到一个很好的例子。

【问题讨论】:

【参考方案1】:

Active Query 表示与Active Record 类关联的数据库查询。它通常用于覆盖特定模型的默认find() 方法,用于在发送到数据库之前生成查询:

class OrderQuery extends ActiveQuery

     public function payed()
     
        return $this->andWhere(['status' => 1]);
     

     public function big($threshold = 100)
     
        return $this->andWhere(['>', 'subtotal', $threshold]);
     


如果您之前使用过 Yii 1,那么这就是在 Yii2 中替换 Yii 1.x Named Scopes 的内容。您所要做的就是覆盖 model 类中的 find() 方法以使用上面的 ActiveQuery 类:

// This will be auto generated by gii if 'Generate ActiveQuery' is selected
public static function find()

    return new \app\models\OrderQuery(get_called_class());

那么你可以这样使用它:

$payed_orders      =   Order::find()->payed()->all();

$very_big_orders   =   Order::find()->big(999)->all();

$big_payed_orders  =   Order::find()->big()->payed()->all();

上面定义的同一 ActiveQuery 类的不同用例是在相关 model 类中定义 relational data 时使用它,例如:

class Customer extends \yii\db\ActiveRecord

    ...

    public function getPayedOrders()
    
        return $this->hasMany(Order::className(),['customer_id' => 'id'])->payed();
    

然后您可以通过执行以下操作急切地加载 客户 和他们各自的已付款订单

$customers = Customer::find()->with('payedOrders')->all(); 

【讨论】:

答案的宝石。描述得这么好。喜欢它谢谢你:) 很高兴@noc2spamツ 我很高兴它有帮助。谢谢 是否也可以修改 Select 语句? 是的 @geilt select 和 addSelect 是我们可以使用的 ActiveQuery 方法。这是一个示例:***.com/questions/43840406/…

以上是关于Yii2:ActiveQuery 示例以及在 Gii 中单独生成 ActiveQuery 类的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 ActiveQuery 加入保持返回不同的值

Yii2 中的 $with 和 $joinWith 有啥区别以及何时使用它们?

Yii2设计模式——静态工厂模式

Yii2 设计模式——静态工厂模式

Yii2 - ActiveRecord 到数组

yii2 commands模式以及配置crontab定时任务