Laravel — нетерпеливый загруженный объект не установлен

#laravel #eloquent #eager-loading

#laravel #красноречивый #нетерпеливая загрузка

Вопрос:

Что-то странное происходит с моим приложением laravel 4.0. У меня есть таблица пользователей и профили таблиц. В их моделях:

 // app/models/User.php:
public function profile(){
    return $this->hasOne('Profile', 'user_id');
}

// app/models/Profile.php:
public function user(){
    return $this->belongsTo('User');
}
  

Я уверен, что все строки в таблице profiles имеют идентификатор пользователя, и у него есть соответствующий пользователь в таблице users, и наоборот. Но когда я делаю это:

 $users = User::with('profile')->get();
foreach($users as $user){
    if(isset($user->profile)){
        print($user->profile->name);
    }
    else{
        print('profile is not set! why?!');
    }
}
  

Иногда я получаю сообщение «профиль не установлен! Почему?!»

Итак, почему?!

Комментарии:

1. Я сомневаюсь, что это происходит «иногда», а скорее происходит «все время», но для конкретных пользователей. Попробуйте print('profile is not set for' . $user->id); и исследуйте эти записи?

2. Я предполагаю, что в профиле может быть более одного пользователя. В таком случае, не следует ли объявить связь как : $this-> belongsTo(‘Profile’); ?

3. Я забыл обновить это… Это была моя ошибка: я нашел профиль без соответствующего пользователя.

Ответ №1:

Могут быть и другие причины. ЕСЛИ вы уверены, что соответствующий User имеет связанный Profile , убедитесь, что эти профили не удалены. Это часто случается с мягко удаляемыми моделями. Если вы используете мягкое удаление, это тоже может быть проблемой. Чтобы узнать, вы можете попробовать эти:

 // Get the users who has related Profile
$users = User::has('profile')->with('profile')->get();
  

Также попробуйте это:

 // Get users with profile even soft deleted ones
$users = User::with(array('profile' => function($query) {
    $query->withTrashed();
}))->get();
  

Сравните оба результата. Это всего лишь предположение.