Bandicoot
@Bandicoot
Backend Developer since 2015

Зачем нужен ActiveQuery в Yii2?

Уже более 3-х лет работаю с Yii2, все это время обходился исключительно ActiveRecord. Но есть же еще ActiveQuery, но до него чет руки так и не доходили.
Зачем именно нужен этот класс?
Если быть более конкретным, зачем нужна эта опция, при генерации модели через Gii?
5b28c652d8b06395601887.png
  • Вопрос задан
  • 2276 просмотров
Решения вопроса 2
Maksclub
@Maksclub
maksfedorov.ru
Если быть более, конкретным, зачем нужна эта опция, при генерации модели через Gii?

Чтобы вы могли добавить свои кастомные методы или переопределить родные (all(), one() и другие, короче переопределить родной ActiveQuery и изменить на свои абстракции)

Вот пример контроллера:
actual() -- такого метода нет в ORM, а мне нужен, ну вот хочу так пользоваться:
$trainings = Training::find()->actual($date);

ActiveQuery

Ну раз нужен -- добавляем такой метод
class TrainingQuery extends \yii\db\ActiveQuery
{
    public function actual($date)
    {
        return
            $this->alias('t')
            ->joinWith(['lesson l' => function($q){
                $q->joinWith('studio s');
            }])
            ->andWhere(['l.active' => 1])
            ->andWhere(['s.active' => 1])
            ->andWhere(['t.date' => $date])
            ->all();
    }
}

Сущность

В сущности перенацеливаем родной find() на мой кастомный
class Training extends \yii\db\ActiveRecord
{
...
public static function find()
    {
        return new \mynamespace\entities\query\TrainingQuery(get_called_class());
    }

Ответ написан
@iSensetivity
бухгалтер, програміст-самоук
Например, для такого:
https://github.com/samdark/yii2-cookbook/blob/mast...

Или для вьізова цепочек типа:
User::find()->active()->haveSale()->bornToday()->all();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SwoDs
@SwoDs
PHP YII2
Открою вам секрет, ActiveRecord использует ActiveQuery, более полную информацию вы можете получить изучив документацию и гайд (за 3 года можно было и ознакомиться) =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы