Laravel通过与其属性相同的名称获得Eloquent关系

时间:2017-01-04 09:47:18

标签: php laravel eloquent laravel-5.2

我有这样的数据库表:

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

拍摄中雄辩的关系定义如下:

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

使用dd()时,我发现这是正常的:

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

然而,当我急切地加载拍摄并尝试获取程序对象时,我会检索拍摄属性“程序”。 E.g:

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

是否有解决方案而无需重写大量代码库?

3 个答案:

答案 0 :(得分:5)

您不应对relationshipcolumn这两个名称使用相同的名称,否则您将始终收到column名称,因此请尝试编辑其中一个名称,我认为这里最简单的是relationship名称:

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

然后将其称为:

echo $shoot->programmeObj;

注意:但是如果您想遵循惯例,则应将programme_id替换为name属性,以便:

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

希望这会有所帮助。

答案 1 :(得分:1)

这将始终返回数据库中的列(如果存在),即ID 1.

当您致电dump($shoot);时,您应该获得包含所有属性的数组。但是当你运行以下内容时,你应该得到这个名字:

你的模特:

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

你的控制器:

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

希望这有效!

答案 2 :(得分:1)

要实现以下目标,您需要执行以下操作:

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