Ошибка в AR

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Ошибка в AR

Сообщение webster »

Тема в поисках истины: http://www.yiiframework.ru/forum/viewto ... 19&t=18471

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

$query = ModelA::find()->select(['a.id', 'b.name'])->from(['a' => ModelA::tableName()])->innerJoinWith([
    'ModelB' => function ($query) {
        /** @var $query ActiveQuery */
        $query->from(['b' => ModelB::tableName()]);
    },
]); 
Если присутствует select или addSelect, то связанная модель ModelB не заполняется данными. По пробовал разные варианты. например так.

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

$query = ModelA::find()->select(['a.id'])->from(['a' => ModelA::tableName()])->innerJoinWith([
    'ModelB' => function ($query) {
        /** @var $query ActiveQuery */
        $query->from(['b' => ModelB::tableName()]);
        $query->addSelect(['b.name'])
    },
]); 
Ни чего не выходит. Работает только если полностю убрать все вызовы select и addSelect.
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Ошибка в AR

Сообщение webster »

Как оказалось (судя по запросам в логе) вариант без select спасает лишь потому что, там делается еще один SELECT как в варианте с обычным with(). А в SELECT с JOIN возвращаются данные только из первой таблицы.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Ошибка в AR

Сообщение samdark »

Это логично. Набор полей не соответствует полям модели + выбирается недостаточно данных. Заполнять просто не из чего...
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Ошибка в AR

Сообщение webster »

Где же логика? Смысл в таких join когда данные из таблицы не выбираются. Хотя по логике должно в каждую модель прийти по полю. В модель "ModelA" колонка "id", а в "ModelB" колонка "name".

Если это не логично, то подскажите как логично выбрать данные с JOIN из двух таблиц?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Ошибка в AR

Сообщение lynicidn »

а как ты хочешь получить в ответ 2 модели?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Ошибка в AR

Сообщение lynicidn »

>Если это не логично, то подскажите как логично выбрать данные с JOIN из двух таблиц?
через with, будет правда лишний запрос, но не будет зависимости на конкретную БД
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Ошибка в AR

Сообщение samdark »

Хотя-бы id должен присутствовать и в одной и в другой модели.
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Ошибка в AR

Сообщение webster »

lynicidn писал(а):>Если это не логично, то подскажите как логично выбрать данные с JOIN из двух таблиц?
через with, будет правда лишний запрос, но не будет зависимости на конкретную БД
Так вот и дело то в том что мой пример с join также как и with делает два запроса. А join по большому счету выходит как костыль для всяких сортировок.
webster
Сообщения: 36
Зарегистрирован: 2011.12.17, 13:17

Re: Ошибка в AR

Сообщение webster »

Sam Dark писал(а):Хотя-бы id должен присутствовать и в одной и в другой модели.
Не пойму что вы имеете виду. Нужно что-то добавить в выборку? Так в примере и так данные есть. Ради интереса пробовал выбрать id из обеих, и пробовал со *. Все по старому.

Вообще вот https://github.com/yiisoft/yii2/issues/3929 что пишут. Мол это решение такое. Выглядит конечно они совсем не ахти. join получается как костыль для всяких grid где нужны сортировки. Ведь все-равно идет второй запрос как с обычным with. В доке вроде про это не сказано.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Ошибка в AR

Сообщение astronin »

webster писал(а):
Sam Dark писал(а):Хотя-бы id должен присутствовать и в одной и в другой модели.
Не пойму что вы имеете виду. Нужно что-то добавить в выборку? Так в примере и так данные есть. Ради интереса пробовал выбрать id из обеих, и пробовал со *. Все по старому.

Вообще вот https://github.com/yiisoft/yii2/issues/3929 что пишут. Мол это решение такое. Выглядит конечно они совсем не ахти. join получается как костыль для всяких grid где нужны сортировки. Ведь все-равно идет второй запрос как с обычным with. В доке вроде про это не сказано.
если я правильно понял, то в селекте должно быть как минимум

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

['a.id', 'b.id']
это же AR, тут обязательно должны быть эти поля, чтоб можно было бы потом манипулировать моделями, тот же update
а вы для второй таблицы id не возвращаете, вот модель видимо и не может собраться
Ответить