Yii2 нетерпимая загрузка не работает

64
8

У меня есть две сущности в моей базе данных, связанные друг с другом отношением: "Пользователь" и "Объявление". Я создал классы моделей с помощью gii. Это то, что у меня в классе модели для пользователя:

public function getAds()
{
return $this->hasMany(Ad::className(), ['user' => 'id']);
}

и для моей модели объявлений:

public function getUser0()
{
return $this->hasOne(User::className(), ['id' => 'user']);
}

согласно документации Yii2, в контроллере, когда я это делаю

$ads = Ad::find()->all();
var_dump($ads[0]->user);

Он должен с нетерпением загружать пользовательские данные из БД, но я получаю только внешний ключ (1). Даже когда я пытаюсь

$ads = Ad::find()->with('user0')->all();
var_dump($ads[0]->user);

Его все равно то же самое.

Благодарю. Если я хочу отправить Объявления и связанные с ними пользовательские данные с помощью xml в ActiveController, мне нужно сделать что-то вроде этого:

$t = array();
foreach ($ads as $ad) {
$t[] = [$ad, $ad->user0];
}
return $t;

Или есть более простой способ сделать это?

спросил(а) 2021-01-19T18:17:48+03:00 6 месяцев, 1 неделя назад
1
Решение
77

Вы по-прежнему получаете объекты объявлений с или без загрузки.

Разница заключается в том, как заполняются отношения, при ленивой загрузке отношения загружаются только при их доступе.

$ads = Ad::find()->all();
foreach ($ads as $ad) {
var_dump($ad->user0); // query to load user record here
}

С нетерпеливой загрузкой они заполняются спереди.

$ads = Ad::find()->with('user0')->all();
foreach ($ads as $ad) {
var_dump($ad->user0); // user0 already populated, no query
}

ответил(а) 2021-01-19T18:17:48+03:00 6 месяцев, 1 неделя назад
45

Вероятно, вам нужно joinWith $ads = Ad::find()->joinWith('user0')->all();

ответил(а) 2021-01-19T18:17:48+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема