Жадная загрузка

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

Жадная загрузка

Сообщение Brainfuck »

Пытаюсь понять что такое жадная загрузка. С with вроде работает. Но с via никак не выходит...

Например:

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

class Article extends ActiveRecord {
	public function getPayments() {
		return $this->hasMany(ArticlePayment::class, ['article_id' => 'id']);
	}
}

class Contest extends ActiveRecord {
    public function getArticles() {
        return $this->hasMany(Article::class, ['contest_id' => 'id']);
    }
}

$contest = Contest::find()->where(['id' => 1])->with('articles')->via('payments')->one();
Выдает ошибку "Call to a member function getRelation() on null". Именно на via (без него, только с with все срабатывает).
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Жадная загрузка

Сообщение zelenin »

Contest::find()-> ... ->via('payments')->one();

у Contest нет payments
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Жадная загрузка

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Жадная загрузка

Сообщение Brainfuck »

zelenin писал(а): 2018.07.13, 11:35 Contest::find()-> ... ->via('payments')->one();

у Contest нет payments
Но у Article то есть! Я просто не могу понять что вообще делает этот via. Я читал доки, но не понял... Объясните мне пожалуйста простыми словами.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Жадная загрузка

Сообщение Brainfuck »

И еще один момент

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

/**
 * @property-read User $user
 */
class Article extends ActiveRecord {
	public function getUser() {
		return $this->hasOne(User::class, ['id' => 'user_id']);
	}
}
Я год писал на Yii2 и только что обнаружил что если вот так указывать геттер на связь то автоматически генерируется пропертя. Причем даже безо всяких with. Это поведение где-то описано? Почему я об этом ничего не знал... :? Это здорово все упрощает!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Жадная загрузка

Сообщение Dominus »

Brainfuck писал(а): 2018.07.13, 11:37 Но у Article то есть! Я просто не могу понять что вообще делает этот via. Я читал доки, но не понял... Объясните мне пожалуйста простыми словами.
https://github.com/yiisoft/yii2/blob/ma ... %86%D1%8B-
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Жадная загрузка

Сообщение zelenin »

Brainfuck писал(а): 2018.07.13, 11:37
zelenin писал(а): 2018.07.13, 11:35 Contest::find()-> ... ->via('payments')->one();

у Contest нет payments
Но у Article то есть! Я просто не могу понять что вообще делает этот via. Я читал доки, но не понял... Объясните мне пожалуйста простыми словами.
https://github.com/yiisoft/yii2/blob/ma ... %86%D1%8B-

тут вроде понятно изложено. это связь через промежуточную таблицу
order => order_item => item в order можно получить items через/via order_items(order_id, item_id)
Последний раз редактировалось zelenin 2018.07.13, 11:42, всего редактировалось 1 раз.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Жадная загрузка

Сообщение Brainfuck »

Dominus писал(а): 2018.07.13, 11:41
Brainfuck писал(а): 2018.07.13, 11:37 Но у Article то есть! Я просто не могу понять что вообще делает этот via. Я читал доки, но не понял... Объясните мне пожалуйста простыми словами.
https://github.com/yiisoft/yii2/blob/ma ... %86%D1%8B-
Это дублированные доки на русском языке. Я их уже читал. Упорно не понимаю как работает via. Даже после 10 раз прочтения доков... У меня она не работает никак... :?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Жадная загрузка

Сообщение zelenin »

Brainfuck писал(а): 2018.07.13, 11:39 И еще один момент

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

/**
 * @property-read User $user
 */
class Article extends ActiveRecord {
	public function getUser() {
		return $this->hasOne(User::class, ['id' => 'user_id']);
	}
}
Я год писал на Yii2 и только что обнаружил что если вот так указывать геттер на связь то автоматически генерируется пропертя. Причем даже безо всяких with. Это поведение где-то описано? Почему я об этом ничего не знал... :? Это здорово все упрощает!
для каждой связи model::getSomething() существует model->something
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Жадная загрузка

Сообщение Brainfuck »

zelenin писал(а): 2018.07.13, 11:42
Brainfuck писал(а): 2018.07.13, 11:37
zelenin писал(а): 2018.07.13, 11:35 Contest::find()-> ... ->via('payments')->one();

у Contest нет payments
Но у Article то есть! Я просто не могу понять что вообще делает этот via. Я читал доки, но не понял... Объясните мне пожалуйста простыми словами.
https://github.com/yiisoft/yii2/blob/ma ... %86%D1%8B-

тут вроде понятно изложено. это связь через промежуточную таблицу
order => order_item => item в order можно получить items через/via order_items(order_id, item_id)
Ооо кажется дошло. Я почему-то не замечал раньше эту надпись про промежуточную таблицу. :lol: Значит via это исключительно для промежуточных таблиц? Т.е. связь многие ко многим?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Жадная загрузка

Сообщение zelenin »

Brainfuck писал(а): 2018.07.13, 11:48
zelenin писал(а): 2018.07.13, 11:42
Brainfuck писал(а): 2018.07.13, 11:37

Но у Article то есть! Я просто не могу понять что вообще делает этот via. Я читал доки, но не понял... Объясните мне пожалуйста простыми словами.
https://github.com/yiisoft/yii2/blob/ma ... %86%D1%8B-

тут вроде понятно изложено. это связь через промежуточную таблицу
order => order_item => item в order можно получить items через/via order_items(order_id, item_id)
Ооо кажется дошло. Я почему-то не замечал раньше эту надпись про промежуточную таблицу. :lol: Значит via это исключительно для промежуточных таблиц? Т.е. связь многие ко многим?
да
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Жадная загрузка

Сообщение Brainfuck »

Тогда все. Спасибо. Разобрался. Меня кто-то спутал сказав что via это тоже связано с жадной загрузкой. А это всего лишь связь многие ко многим. :)
Ответить