Аналог through Yii1 в Yii2

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

Аналог through Yii1 в Yii2

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

Есть юзеры (user), у юзеров есть посты (post, с полем cat_id), у постов есть категории post_cat. Как сделать рилейшен в модели User, что получить все категории постов для всех постов юзеров (без повторений, конечно)?

Вот примерный аналогичный Query:

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

$postCatModels = PostCat::find()->joinWith('posts')->where(['post.user_id' => $user->id]); 
В Yii1 была такая штука как through : http://www.yiiframework.com/doc/guide/1 ... tabase.arr

Спасибо.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

ну доки по yii1 вы прочли, но почему же не прочесть доки по yii2? Открываем доку по AR, ищем relations, тратим 15 секунд на прочесть по диагонали, остановившись на необходимом функционале.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

via.
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

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

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

Sam Dark писал(а):via.
Я думал, это другое: это аналог MANY_MANY для Yii1.

Значит via в Yii2 заменило и through и MANY_MANY (в Yii1 это были разные вещи)?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

Антон Смирнов писал(а):
Sam Dark писал(а):via.
Я думал, это другое: это аналог MANY_MANY для Yii1.

Значит via в Yii2 заменило и through и MANY_MANY (в Yii1 это были разные вещи)?
via - это через. MANY_MANY - это hasMany. Разные вещи.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Значит via в Yii2 заменило и through и MANY_MANY (в Yii1 это были разные вещи)?
Да.

zelenin, написать "via" проще, короче и более по теме, чем намекать на лень и нежелание доку читать ;) К тому же, думаю, в случае Антона это, судя по его постам с 2011 года, не так. Да и вообще недружелюбно как-то...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

Sam Dark писал(а):zelenin, написать "via" проще, короче и более по теме, чем намекать на лень и нежелание доку читать
вы купили еду, разжевали и положили в рот, а я дал средство добывания еды самому. Мой вариант явно полезнее, если человек обучаем.
Sam Dark писал(а):;) К тому же, думаю, в случае Антона это, судя по его постам с 2011 года, не так.
очевидно, в случае невозможности найти ответ на простой вопрос самостоятельно, срок перестает играть роль в оценке адекватности.
Sam Dark писал(а): Да и вообще недружелюбно как-то...
я не друг, а член сообщества, ратующий за "научить", а не "сделать за".

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

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

Сообщение samdark »

Я не совсем разжевал. Я дал название того, что надо в доке найти. Не дать ничего — это как-то не торт.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

Sam Dark писал(а):Я не совсем разжевал. Я дал название того, что надо в доке найти. Не дать ничего — это как-то не торт.
да ну. я практически бредкрамб описал - дока, связи, читать.
Открываем доку по AR, ищем relations, тратим 15 секунд на прочесть по диагонали, остановившись на необходимом функционале.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

ОК :) Но можно было и без намёков.
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

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

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

Это обычный троллинг. Человек приходит в тему, судя по всему сам не знает ответа, пишет комментарий "Ты дурак" и опять троллит. Раньше так счетчики сообщений набивали в начале 2000-х, сейчас видимо просто много свободного времени..
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

Антон Смирнов писал(а):Это обычный троллинг.
то есть ты пришел в тему, не прочел ее, и теперь нас всех троллишь? и зачем тебе эти сообщения? кушать их будешь?
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

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

Сообщение kukuruku »

Sam Dark писал(а):
Значит via в Yii2 заменило и through и MANY_MANY (в Yii1 это были разные вещи)?
Да.

zelenin, написать "via" проще, короче и более по теме, чем намекать на лень и нежелание доку читать ;) К тому же, думаю, в случае Антона это, судя по его постам с 2011 года, не так. Да и вообще недружелюбно как-то...
согласен, тоже не первый раз замечаю это за форумчанином zelenin
если уж так хочется поучить, почему бы не дать прямую ссылку на ответ и пусть тогда сам читает
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

kukuruku писал(а):если уж так хочется поучить, почему бы не дать прямую ссылку на ответ
Надо эту самую ссылку с галочкой "Я прочёл официальный гайд" в форме регистрации форума вместо капчи вывести.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

kukuruku писал(а):если уж так хочется поучить, почему бы не дать прямую ссылку на ответ и пусть тогда сам читает
а чем отличается "читай доку, раздел Связи" от "читай доку, раздел Связи, <ссылка>"? Я исключаю вариант, что человек не знает ссылку/не может ее найти.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

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

Сообщение S c »

ElisDN писал(а):
kukuruku писал(а):если уж так хочется поучить, почему бы не дать прямую ссылку на ответ
Надо эту самую ссылку с галочкой "Я прочёл официальный гайд" в форме регистрации форума вместо капчи вывести.
Плюсую. А при создании темы еще 10 раз переспросить - пытался ли пользователь найти ответ в доке или нет (и ссылки на en и ru документацию)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Такое, кстати, на StackOverflow практикуется. При создании вопроса выдаётся список похожих.
Аватара пользователя
Антон Смирнов
Сообщения: 284
Зарегистрирован: 2011.07.08, 10:37
Контактная информация:

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

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

Sam Dark писал(а):Такое, кстати, на StackOverflow практикуется. При создании вопроса выдаётся список похожих.
Александр, пожалуйста, проясните ситуацию, вы полностью не правы.

В Yii1 through - это не только HAS_MANY, связь может и такая HAS_ONE. Например, user-profile-profile_image (3 таблицы, одной строчке из user соответствует одна строчка "profile_image")

В Yii2 в доке как пример рассматривается именно MANY_MANY (что соответствует hasMany в Yii2) для viaTable(), т.е. не как пример чуть выше. Посмотрите на исходный код: https://github.com/yiisoft/yii2/blob/ma ... y.php#L719

Иными словами, via предназначен только для получения hasMany, для hasOne не подходит - это означает, что это совсем не аналог through в Yii1: "through can be used with HAS_ONE, BELONGS_TO and HAS_MANY relations." - из доки Yii1.

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

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

Сообщение samdark »

Я про via говорил, а не про viaTable:

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

public function getOrders()
{
  return $this->hasOne(Order::className(), ['id' => 'order_id']);
}

public function getOrderItems()
{
  return $this->hasMany(Item::className(), ['id' => 'item_id'])
              ->via('orders');
}
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Но вообще прямо совсем-совсем прямого аналога в Yii 2.0 нет.
Ответить