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

2022-08-30 12:23:01

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

ActiveQuery in Gii


答案 1

活动查询表示与活动记录类关联的数据库查询。它通常用于覆盖特定模型的默认方法,在该模型中,它将用于在发送到DB之前生成查询: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 命名范围的位置。您所要做的就是重写模型类中的方法以使用上面的ActiveQuery类:find()

// 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 类的另一个用例是在相关模型类中定义关系数据时使用它,例如:

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

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

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

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

答案 2

推荐