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

kir*_*rgy 3 php laravel eloquent laravel-5.2

我有这样的数据库表:

shoot: id, name, programme
programme: id, name
Run Code Online (Sandbox Code Playgroud)

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

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

使用时dd(),我可以看到它正常工作:

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

但是,当我渴望加载拍摄并尝试获取程序对象时,我取而代之的是获取拍摄属性“ programme”。例如:

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

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

Zak*_*rki 6

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

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

然后将其称为:

echo $shoot->programmeObj;
Run Code Online (Sandbox Code Playgroud)

注意:但是,如果要遵循约定,则应将programme_idso 替换为name属性:

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

希望这可以帮助。

  • 我想避免重命名整个代码中对属性的每个引用,因为现阶段的代码库非常庞大。然而,我认为这将是最好的选择。很高兴知道一个简单的解决方法是重命名模型函数。 (2认同)

Vla*_*les 6

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

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