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

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

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

Сообщение Brainfuck » 2018.07.13, 10:04

Пытаюсь понять что такое жадная загрузка. С 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 » 2018.07.13, 11:35

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

у Contest нет payments

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

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

Сообщение Dominus » 2018.07.13, 11:36

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!

Brainfuck
Сообщения: 183
Зарегистрирован: 2018.02.19, 14:20

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

Сообщение Brainfuck » 2018.07.13, 11:37

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

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

Brainfuck
Сообщения: 183
Зарегистрирован: 2018.02.19, 14:20

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

Сообщение 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. Это поведение где-то описано? Почему я об этом ничего не знал... :? Это здорово все упрощает!

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

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

Сообщение Dominus » 2018.07.13, 11:41

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 » 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)
Последний раз редактировалось zelenin 2018.07.13, 11:42, всего редактировалось 1 раз.

Brainfuck
Сообщения: 183
Зарегистрирован: 2018.02.19, 14:20

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

Сообщение Brainfuck » 2018.07.13, 11:42

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 » 2018.07.13, 11:46

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
Сообщения: 183
Зарегистрирован: 2018.02.19, 14:20

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

Сообщение Brainfuck » 2018.07.13, 11:48

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 » 2018.07.13, 11:50

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
Сообщения: 183
Зарегистрирован: 2018.02.19, 14:20

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

Сообщение Brainfuck » 2018.07.13, 11:58

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

Ответить