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

Връща нула с user релация, което подозирам, че причинява undefined propertyгрешка в блейд.

Възможен ли е този подход? Правилни ли са отношенията ми?

P.S. По-рано имах обратен случай при заявка за модел User и модел eagerload Profile и това проработи.
Snippet

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

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


Отговори (2)


Получавате null за, защото дефиницията ви на релация е грешна. Вашият 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