Загрузка из связанных таблиц в Active Record

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Haku
Сообщения: 56
Зарегистрирован: 2015.03.11, 07:39

Загрузка из связанных таблиц в Active Record

Сообщение Haku » 2017.10.19, 23:37

Добрый вечер.
У меня имеется модель "Profile", унаследованная от ActiveRecord, в которой имеется несколько связей:

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

public function getCountry()
{
    return $this->hasOne(Country::className(), ['id' => 'country_id']);
}

public function getGroup()
{
    return $this->hasOne(Group::className(), ['id' => 'group_id']);
}
Мне нужно получить объект, в котором будут все атрибуты из таблицы "profile", а также из таблиц "country" и "group". Для этого у меня есть следующий метод в модели "Profile":

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

return static::find()
    ->where(['user_id' => $userId])
    ->with(['country', 'group'])
    ->one();
Всё хорошо работает, но посмотрев в debug-панели список запросов к базе данных, я заметил, что выполняется не один запрос с операторами JOIN, а три:

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

SELECT * FROM `profile` WHERE `user_id`='1';
SELECT * FROM `country` WHERE `id`='10';
SELECT * FROM `group` WHERE `id`='3';
Я пробовал менять with() на joinWith(), после чего первый запрос заменялся на:

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

SELECT `profile`.*
FROM `profile`
LEFT JOIN `country` ON `profile`.`country_id` = `country`.`id`
LEFT JOIN `group` ON `profile`.`group_id` = `group`.`id`
WHERE `user_id`='1'
но поскольку в SELECT указаны все поля только для таблицы "profile" ничего не изменилось. Я также пробовал добавлять к find() метод select('*'), но в результате всё равно выполняется 3 запроса, хотя в логах первый запрос получается правильным.
Подскажите, как правильно составить конструкцию ActiveQuery, чтобы получать данные из БД одним запросом? Или возможно я что-то не понимаю в работе Active Record в Yii 2, в этом случае, буду рад услышать пояснения.

Теги: yii2, activerecord, query, activequery, relations, join.


Аватара пользователя
Haku
Сообщения: 56
Зарегистрирован: 2015.03.11, 07:39

Re: Загрузка из связанных таблиц в Active Record

Сообщение Haku » 2017.10.20, 00:28

ElisDN писал(а):
2017.10.20, 00:00
viewtopic.php?f=19&t=45262
ElisDN, благодарю, оказывается такая же тема поднималась здесь пару недель назад. Но я соглашусь с автором той темы, что непонятно, почему разработчики не оставили возможности получения данных из нескольких таблиц без дополнительных запросов. Как, в том же Yii 1.1. Я конечно понимаю, что это делается для улучшения читаемости запросов, возможности работать с несколькими разными СУБД, правильной архитектуры и т.п., но если у нас будет 5–7 джоинов, то это же будет сказываться на производительности?

Аватара пользователя
ElisDN
Сообщения: 5355
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Загрузка из связанных таблиц в Active Record

Сообщение ElisDN » 2017.10.20, 08:51

Haku писал(а):
2017.10.20, 00:28
непонятно, почему разработчики не оставили возможности получения данных из нескольких таблиц без дополнительных запросов.
Потому что тот код для генерации alias-ов ко всем таблицам и полям с последующим разгребанием результата был сложнее.
Haku писал(а):
2017.10.20, 00:28
но если у нас будет 5–7 джоинов, то это же будет сказываться на производительности?
Медленным будет только первый запрос с JOIN-ами. Остальные 5-7 с id IN (...) будут мгновенными.

Ответить