Laravel 列名和关系名相同

Vij*_*ath 5 relationship laravel

列名和关系名可以相同吗?

例子:

我在mack.php 模型中有一个 edit_by 列,我想从用户表中获取 edit_by 中提到的用户的完整详细信息,所以我有如下关系

public function edited_by(){
        return $this->hasOne('App\User','id','edited_by');
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试访问$model->edited_by->first_name它会抛出错误“尝试获取非对象的属性”

除了使用不同的名称之外,还有其他方法可以解决吗?

小智 8

最简洁的答案是不。您不能让它们具有相同的名称,因为如果找到该列,则始终会返回该列,并且如果找到具有该名称的列,则永远不会返回该关系。

将列名更改为 user_id 比edited_by 更合适。它更具描述性,也是 Eloquent 将查找的默认 id。类似地,关系名称被命名为user()而不是edited_by()更有意义,因为它返回一个用户模型。

稍长且完全错误的答案是,您可以使用$model->edited_by()->first_name访问关系,但这将导致不必要地运行额外的查询。

  • 更重要的是:PSR-1 标准说每个方法都应该是驼峰命名法,并且 mysql 指南说你应该对 multiple_keywords_columns 使用下划线。所以基本上你可以一起使用 `editedBy()` 方法和 `edited_by` sql 列。来源:http://www.sqlstyle.guide/,https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md (3认同)