Join и ActiveRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Driver86
Сообщения: 141
Зарегистрирован: 2015.04.13, 14:17

Join и ActiveRecord

Сообщение Driver86 »

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

$data = Entry::find()->where(['entry.module_id' => $id])->joinWith(['category', 'user'])->all(); 
Ожидания

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

SELECT алиасы и ко FROM `entry` LEFT JOIN `category` ON `entry`.`category_id` = `category`.`id` LEFT JOIN `user` ON `entry`.`user_id` = `user`.`id` WHERE `entry`.`module_id`=3
Реальность

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

SELECT `entry`.* FROM `entry` LEFT JOIN `category` ON `entry`.`category_id` = `category`.`id` LEFT JOIN `user` ON `entry`.`user_id` = `user`.`id` WHERE `entry`.module_id=3

SELECT * FROM `user` WHERE `id`='1'  // WTF ?

SELECT * FROM `category` WHERE `id` IN ('1', '2') // WTF ??!!
 
Не ясно зачем тогда джойны, если всё равно делаются дополнительные запросы к базе. Более того, вариант с IN отпадает по понятным причинам. Как осуществить задуманное (через ActiveRecord), и только задуманное?
И доп.вопрос: в чём сакральный смысл такой записи - {{%table}} ? (гугление ничего не дало, поиск по форуму с таким словом не хочет работать).
Спишь?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Join и ActiveRecord

Сообщение zelenin »

вы документацию принципиально не прочли? там описывается как работает joinWith и что такое {{%table}}
Аватара пользователя
krosh87
Сообщения: 160
Зарегистрирован: 2015.02.18, 15:32
Контактная информация:

Re: Join и ActiveRecord

Сообщение krosh87 »

Разработка, продвижение, сопровождение сайтов на Modx, Bitrix, Yii http://www.webapplex.ru
Ro7
Сообщения: 71
Зарегистрирован: 2013.08.17, 15:08

Re: Join и ActiveRecord

Сообщение Ro7 »

Не первый месяц работаю c yii2, но что за синтаксис {{%table}} тоже не нахожу в документации и api
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Join и ActiveRecord

Сообщение mkramer »

Ro7 писал(а):Не первый месяц работаю c yii2, но что за синтаксис {{%table}} тоже не нахожу в документации и api
Так это чтоб yii автоматом префиксы подставлял, если они есть
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Join и ActiveRecord

Сообщение mickgeek »

Ferro7 писал(а):И доп.вопрос: в чём сакральный смысл такой записи - {{%table}} ? (гугление ничего не дало, поиск по форуму с таким словом не хочет работать).
Плохо ищите.

Quoting Table and Column Names
Миграции - {{}} в названии таблицы
Ro7
Сообщения: 71
Зарегистрирован: 2013.08.17, 15:08

Re: Join и ActiveRecord

Сообщение Ro7 »

Понятно.
Про использование непосредственно в запросе понятно, а есть ли фактическое различие написания (не считая возможность префиксов) в методе tableName() между:
return '{{user}}';
return 'user';

Ведь класс и так знает, что это имя таблицы в отличии от

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

// executes this SQL for MySQL: SELECT COUNT(`id`) FROM `tbl_employee`
$count = $db->createCommand("SELECT COUNT([[id]]) FROM {{%employee}}")
            ->queryScalar();
Ro7
Сообщения: 71
Зарегистрирован: 2013.08.17, 15:08

Re: Join и ActiveRecord

Сообщение Ro7 »

Например, если не ошибаюсь, gii генерирует просто строковое значение 'model'
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Join и ActiveRecord

Сообщение zelenin »

Ro7 писал(а):Понятно.
Про использование непосредственно в запросе понятно, а есть ли фактическое различие написания (не считая возможность префиксов) в методе tableName() между:
return '{{user}}';
return 'user';

Ведь класс и так знает, что это имя таблицы в отличии от

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

// executes this SQL for MySQL: SELECT COUNT(`id`) FROM `tbl_employee`
$count = $db->createCommand("SELECT COUNT([[id]]) FROM {{%employee}}")
            ->queryScalar(); 
аналогично. Если у вас префикс таблиц например app_, то '{{%user}}' превратится в app_user. Если вы в tableName() укажите просто user, то таблица будет не найдена, т.к. она app_user.
Ответить