Проблемы с жадной загрузкой.

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Проблемы с жадной загрузкой.

Сообщение Aleksey_ZX »

Делаю такой гетер.

Код: Выделить всё

public function getKindergartenGroup()
  {
    $q = KindergartenGroup::find()
      ->alias('KG')
      ->rightJoin(KindergartenGroupClientRelation::tableName() . ' as KGCR', 'KGCR.kindergarten_group_id = KG.id')
      ->rightJoin(self::tableName() . ' as DCR', 'DCR.user_id = KGCR.user_id and DCR.department_id = KG.kindergarten_id');
    $q->multiple = true;
    $q->link = [
      'KGCR.user_id' => 'user_id',
      'KG.kindergarten_id' => 'department_id'
    ];
    return $q;
  }
При его использовании с жадной загрузкой в БД данных улетает запрос

Код: Выделить всё

SELECT `KG`.* FROM `kindergarten_group` `KG` RIGHT JOIN `kindergarten_group_client_relation` `KGCR` ON KGCR.kindergarten_group_id = KG.id RIGHT JOIN `department_client_relation` `DCR` ON DCR.user_id = KGCR.user_id and DCR.department_id = KG.kindergarten_id WHERE (`KG`.`KGCR`.`user_id`, `KG`.`KG`.`kindergarten_id`) IN ((119, 4), (121, 1), (122, 1), (123, 1), (126, 1), (127, 1), (127, 5), (127, 5), (128, 1), (129, 1), (130, 1), (131, 1), (132, 1), (134, 2), (142, 5), (143, 1), (145, 1), (152, 2), (153, 2), (204, 1), (205, 9), (206, 9), (220, 7), (221, 7))
Проблема:
При создании запроса с связям (link) ('KGCR.user_id' => 'user_id', 'KG.kindergarten_id' => 'department_id') добавляется альянс `KG`.
Виновник vendor\yiisoft\yii2\db\ActiveRelationTrait.php

Код: Выделить всё

private function prefixKeyColumns($attributes)
    {
        if ($this instanceof ActiveQuery && (!empty($this->join) || !empty($this->joinWith))) {
            if (empty($this->from)) {
                /* @var $modelClass ActiveRecord */
                $modelClass = $this->modelClass;
                $alias = $modelClass::tableName();
            } else {
                foreach ($this->from as $alias => $table) {
                    if (!is_string($alias)) {
                        $alias = $table;
                    }
                    break;
                }
            }
            if (isset($alias)) {
                foreach ($attributes as $i => $attribute) {
                    $attributes[$i] = "$alias.$attribute";
                }
            }
        }

        return $attributes;
    }
Предложение: добавить проверку, если задан альянс, то его не добавлять, или добавить возможность отфильтровать запрос который уходит.
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Re: Проблемы с жадной загрузкой.

Сообщение Aleksey_ZX »

Никто ничего не может сказать ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Проблемы с жадной загрузкой.

Сообщение samdark »

При создании запроса с связям (link) ('KGCR.user_id' => 'user_id', 'KG.kindergarten_id' => 'department_id') добавляется альянс `KG`.

Почему это проблема?
Aleksey_ZX
Сообщения: 52
Зарегистрирован: 2015.08.07, 18:12

Re: Проблемы с жадной загрузкой.

Сообщение Aleksey_ZX »

Почему это проблема?
я получаю запрос :
... WHERE (`KG`.`KGCR`.`user_id`, `KG`.`KG`.`kindergarten_id`) IN ((119, 4), (121, 1) ...
а мне нужен запрос:
... WHERE (`KGCR`.`user_id`, `KG`.`kindergarten_id`) IN ((119, 4), (121, 1) ...
Запрос в таком виде я не могу получить.
------
Могу такой
... WHERE (`KG`.`user_id`, `KG`.`kindergarten_id`) IN ((119, 4), (121, 1) ...

у меня 3 таблицы, первый ключ из первой связан с 3 напрямую, а второй, через промежуточную таблицу. получить группировку мне нужно по двум ключам. Сделать такой запрос с жадной загрузкой не могу.

Если добавить возможность самому задавать таблицу/альянс в ->link, то можно будет составить запрос любой сложности и использовать его в жадной загрузке.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Проблемы с жадной загрузкой.

Сообщение samdark »

А зачем вы используете rightJoin вместо joinWith()?
Ответить