Yii2: Пример ActiveQuery и в чем причина создания класса ActiveQuery отдельно в Gii?
1 answers
Активный запрос представляет запрос БД, связанный с классом Активной записи . Обычно он используется для переопределения метода по умолчанию 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, то это то, что заменяет Yii 1.x Именованные области в Yii2. Все, что вам нужно сделать, это переопределить метод 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, определенного выше, заключается в его использовании при определении реляционных данных в соответствующем классе модели , например:
class Customer extends \yii\db\ActiveRecord
{
...
public function getPayedOrders()
{
return $this->hasMany(Order::className(),['customer_id' => 'id'])->payed();
}
}
Затем вы можете загрузить клиентов с их соответствующими оплаченными заказами , выполнив:
$customers = Customer::find()->with('payedOrders')->all();