Laravel get Eloquent relation by same name as its

2019-02-25 18:01发布

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?

3条回答
倾城 Initia
2楼-- · 2019-02-25 18:28

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.

查看更多
再贱就再见
3楼-- · 2019-02-25 18:29

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.
查看更多
我命由我不由天
4楼-- · 2019-02-25 18:35

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!

查看更多
登录 后发表回答