Laravel get Eloquent relation by same name as its attribute

China☆狼群 提交于 2019-12-01 23:47:43

问题


I have database tables like this:

shoot: id, name, programme
programme: id, name

The eloquent relationship in the shoot is defined like this:

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

When using dd(), I can see this is working correctly:

dd(Shoot:where('id','=',1)->with('programme')->first());
// prints the object with programme listed under the relationship

However when I eager-load the shoot and attempt to get the programme object, I retrieve the shoot attribute "programme" instead. E.g.:

$shoot = Shoot:where('id','=',1)->with('programme')->first();
echo $shoot->programme; // returns 1, not App\Programme object.

Is there a solution to this without having to rewrite masses of the codebase?


回答1:


You shouldn't use the same name for the both relationship and column name, else you'll receive always the column name so try to edit one of them, I think the easiest one here is the relationship name :

public function programmeObj() {
    return $this->belongsTo('App\Programme', 'programme', 'id');
}

Then call it as :

echo $shoot->programmeObj;

NOTE : But if you want to follow conventions you should replace the name attribute by programme_id so :

public function programme() {
    return $this->belongsTo('App\Programme', 'programme_id', 'id');
}

Hope this helps.




回答2:


To achieve what you after you will need to do the following:

$shoot = Shoot:where('id','=',1)->with('programme')->first();
$variable = $shoot->programme; // returns 1
$obj = $page->getRelationValue('programme') // returns App\Programme object.



回答3:


This will returns always the column in your database if it exists, that's ID 1.

When you call dump($shoot); you should get the array with all attributes. But when you run the following you should get the name:

Your model:

public function programmeData() {
    return $this->belongsTo('App\Programme', 'programme', 'id');
}

And your controller:

$shoot = Shoot:where('id','=',1)->first();
return $shoot->programmeData->name; // returns name

Hope this works!



来源:https://stackoverflow.com/questions/41460707/laravel-get-eloquent-relation-by-same-name-as-its-attribute

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!