Yii2: Пример ActiveQuery и в чем причина создания класса ActiveQuery отдельно в Gii?


Не могли бы вы привести пример использования. Описание будет высоко оценено. Я не могу найти для этого хорошего примера.

ActiveQuery in Gii

 29
Author: akmnahid, 2015-08-11

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(); 
 72
Author: Salem Ouerdani, 2015-10-07 10:30:57