Eloquent Query всегда возвращает null для родительской таблицы с использованием отношения oneToOne

Родительская таблица

users
schema | 'id','email','pass'

Отношение

 public function profile()
    {
        return $this->hasOne('App\Profile','user_id');
    }

Другой стол

profiles
schema | 'id','user_id'/*foreign key to users table */ ,'address','city'

Отношение

public function user()
    {
        return $this->belongsTo('App\User','id');
    }

Я запрашиваю модель Profile и хочу, чтобы она загружалась с моделью User.

public function edit($id){
$profile = \App\Profile::with('user')->where('id','=',$id)->get();
                dd($profile);
}

Так что я могу загрузить профиль пользователя для редактирования вместе с подробными данными из модели User, например, email & pass и т. Д.

Это возвращает нулевое отношение для user ??

Кроме того, в клинке при доступе $profile->user->email возникает ошибка

Неопределенное свойство: Illuminate \ Database \ Eloquent \ Collection :: $ user (Вид: C: \ xampp \ htdocs \ laravel1 \ resources \ views \ profile \ edit.blade.php)

Вот результат dd() http://bit.ly/1dA0R5p

Он возвращает null с отношением user, которое, как я подозреваю, вызывает undefined propertyerror в лезвии.

Возможен ли такой подход? Мои отношения правильные?

P.S. Раньше у меня был обратный случай при запросе модели User и модели нетерпеливой загрузки Profile, и это сработало.
Snippet

 $users = \App\User::with('group','profile')->get(); //This was working

person echoashu    schedule 12.06.2015    source источник


Ответы (2)


Вы получаете null for, потому что ваше определение отношения неверно. Ваша profile модель должна быть

public function user()
{
    return $this->belongsTo('App\User','user_id');
}

Ошибка возникает из-за того, что вы пытаетесь получить объект user из коллекции.

Поскольку вы использовали get() для получения данных, вы получаете набор профилей, а не один профиль. Если вы хотите, чтобы в одном профиле использовался метод first() вместо get(), иначе используйте его внутри цикла.

@foreach ($profiles as $profile)
   {{ $profile->user->email }}
@endforeach
person chanafdo    schedule 12.06.2015
comment
Это сработало. Быстрый последующий вопрос в отношении belongsTo из модели profile, второй параметр должен быть key для идентификации пользователя в users таблице, верно? Так следует ли мне также создать profile_id внешний ключ в users таблице ?? - person echoashu; 12.06.2015
comment
Да, это внешний ключ. Нет, так не работает. belongsTo отношения используют внешний ключ текущей таблицы для получения данных отношения. Так что наличия user_id на profiles таблице достаточно. Нет необходимости в profile_id на users столе. - person chanafdo; 12.06.2015
comment
Это прояснилось. Спасибо :-) - person echoashu; 12.06.2015

Удалите use SoftDeletes;, если эта строка присутствует в дочерней модели.

namespace App;
use Illuminate\Database\Eloquent\Model;
//use Illuminate\Database\Eloquent\SoftDeletes;
use App\User;
class Profile extends Model
{
//    use SoftDeletes;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'profile';

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = ['address', 'user_id'];

protected $primaryKey = 'user_id';

public function user() {
    return $this->belongsTo('App\User');
}    
}

А теперь установите $primaryKey = 'user_id';

В родительской модели:

public function profile(){
    return $this->hasOne('App\Profile');
}

И поэтому вы можете получить профиль пользователя

$profile = $user->profile? : new Profile;
person Roberto Belotti    schedule 22.11.2015