Аналог through Yii1 в Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

Re: Аналог through Yii1 в Yii2

Сообщение Антон Смирнов »

Sam Dark писал(а):Но вообще прямо совсем-совсем прямого аналога в Yii 2.0 нет.
Еще раз:
1 В Yii1 through работает со всеми связями, кроме MANY_MANY (согласно доке Yii1)

2 В Yii2 via / viaTable работает только с HAS_MANY и MANY_MANY (терминалогия Yii1, в Yii2 - это hasMany())

3 Вы пишите "Я про via говорил, а не про viaTable", открываем доку: http://www.yiiframework.com/doc-2.0/gui ... ecord.html
В ней рассматривается именно пример MANY_MANY и говорится, что разницы между via и viaTable нет, кроме как то, что первая - в параметрах находится рилейшен, вторая - таблица:
"The difference between via() and viaTable() is that the former specifies the junction table in terms of an existing relation name while the latter directly the junction table."
Т.е. разницы с какими типами связей они работают, согласно доке, нет. (это подтверждается кодом: https://github.com/yiisoft/yii2/blob/ma ... y.php#L714 и https://github.com/yiisoft/yii2/blob/ma ... t.php#L103 просто в одном месте рилейшен есть, а в другом - создается) Вы говорите, что разница есть. Кто прав? И в чем тогда разница по вашему?

И главный вопрос темы: viaTable может работать с HAS_MANY (терминалогия Yii1)? Приведу пример наглядно, таблицы: users, photos, photos_albums. Можно с помощью viaTable получить список альбомов, в которые юзер загрузил свои фото? (например, альбомы "Природа" и "Транспорт")? С помощью via это сделать можно. Код не нужен, важен лишь ваш ответ: да / нет.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Аналог through Yii1 в Yii2

Сообщение samdark »

via не нужен в этом случае, если верно понял схему бд и задачу. Схема:

Изображение

Задача: написать в модели User relation таким образом, чтобы можно было сделать:

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

foreach ($user->albumsWithPhotos as $photo) {
    // ...
}
 
Решается через joinWith.
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

Re: Аналог through Yii1 в Yii2

Сообщение Антон Смирнов »

Александр, нет, задача не такая.

В вашей схеме все верно, кроме того, что у таблицы album нет поля user_id, т.е. альбомы связаны с юзерами только через photo.

Задача: получить все альбомы (только альбомы) для данного пользователя:

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

class User ...

public function getAlbums()
{
    return $this->hasMany(...
} 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Аналог through Yii1 в Yii2

Сообщение samdark »

Ну, вот так тогда:

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

/**
 * @return \yii\db\ActiveQuery
 */
public function getAlbums()
{
    return $this->hasMany(Album::className(), ['id' => 'album_id'])->via('photos');
}
 
Это как раз случай из гайда.
Ответить