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

akm*_*hid 33 php gii yii2

你能提供一个例子吗?描述将受到高度赞赏.我找不到一个很好的例子.

Gii中的ActiveQuery

Sal*_*ani 83

主动查询代表与相关的数据库查询的Active Record类.它通常用于覆盖find()特定模型的默认方法,在发送到DB之前,它将用于生成查询:

class OrderQuery extends ActiveQuery
{
     public function payed()
     {
        return $this->andWhere(['status' => 1]);
     }

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

}
Run Code Online (Sandbox Code Playgroud)

如果您之前使用的是Yii 1,那么这就取代了Yii2中的Yii 1.x命名范围.您所要做的就是覆盖模型类中的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());
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样使用它:

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

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

$big_payed_orders  =   Order::find()->big()->payed()->all();
Run Code Online (Sandbox Code Playgroud)

上面定义的相同ActiveQuery类的不同用例是在相关模型类中定义关系数据时使用它,如:

class Customer extends \yii\db\ActiveRecord
{
    ...

    public function getPayedOrders()
    {
        return $this->hasMany(Order::className(),['customer_id' => 'id'])->payed();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过执行以下操作来急切地为客户加载各自的付款订单:

$customers = Customer::find()->with('payedOrders')->all(); 
Run Code Online (Sandbox Code Playgroud)

  • 宝石的答案.如此好描述.喜欢它,谢谢你:) (5认同)
  • 我很高兴@ noc2spamツ我很高兴它有所帮助.谢谢 (3认同)