#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();
Сравните оба результата. Это всего лишь предположение.