【问题标题】:Laravel get Eloquent relation by same name as its attributeLaravel 获得与其属性同名的 Eloquent 关系
【发布时间】:2017-01-04 09:47:17
【问题描述】:

我有这样的数据库表:

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

但是,当我急切加载拍摄并尝试获取程序对象时,我改为检索拍摄属性“程序”。例如:

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

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

【问题讨论】:

  • 这是因为您的关系与您的属性之一具有相同的名称。它会返回您的属性。
  • 坚持命名约定programme - programme_id 你应该很高兴......什么是程序?编码时使用英语。 (谷歌将其标记为拼写错误)
  • It is "proper English" ;) - 程序的英式英语拼写,例如一个电视节目。英式英语中的 Program 明确指的是软件程序。

标签: php laravel eloquent laravel-5.2


【解决方案1】:

您不应该为 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');
}

希望这会有所帮助。

【讨论】:

  • 我想避免重命名整个代码中对属性的每个引用,因为在这个阶段代码库是巨大的。但是,我认为这将是最好的选择。很高兴知道一个简单的解决方法就是重命名模型函数。
【解决方案2】:

要实现你之后的目标,你需要做到以下几点:

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

【讨论】:

    【解决方案3】:

    如果存在,这将始终返回数据库中的列,即 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
    

    希望这行得通!

    【讨论】:

    • 这对我不起作用,调用 dd($shoot->programmeData) - 返回“null”。更新 - 抱歉误解了模型更改,目前这是一个很好的解决方法 - 谢谢!
    • 你改变了什么?
    • @kirgy 不错,另一个解决方案是将shoot -> programme 列更改为programma_id。你可以使用 Zakaria 的其他答案。
    猜你喜欢
    • 2015-09-17
    • 2017-04-02
    • 2020-09-07
    • 2020-01-15
    • 2016-11-21
    • 1970-01-01
    • 2020-04-04
    • 2020-10-20
    • 2021-10-29
    相关资源
    最近更新 更多