Laravel Eloquent ORM 关系命名约定

Posted

技术标签:

【中文标题】Laravel Eloquent ORM 关系命名约定【英文标题】:Laravel Eloquent ORM relationship naming conventions 【发布时间】:2014-03-12 02:15:35 【问题描述】:

在 Eloquent 中定义反向关系时,是否必须将动态属性命名为与相关模型相同的名称?

class Book extends Eloquent 

    public function author()
    
        return $this->belongsTo('Author');
    



$books = Book::all()
foreach ($books as $book) 
    echo $book->author->firstname;

在上面的例子中,我必须调用这个方法 author 还是我可以给它取个别的名字?我试图将其命名为其他名称(只是出于好奇),但它随后返回 null,因此出现错误“尝试获取非对象的属性”。

编辑:我通过将外键传递给 belongsTo 来使其工作,如下所示:

类 Book 扩展 Eloquent

    public function daauthor()
    
        return $this->belongsTo('Author', 'author_id');
    



$book = Book::find(55);
dd($book->daauthor);

谁能解释一下原因?

【问题讨论】:

你可以随意命名它:)。您尝试的错误和函数名称是什么? 如果我将 Book::author() 更改为 Book::daauthor() 并将其称为:$book->daauthor,我将返回 null。 我可以将我的 eloquent 函数重命名为任何东西,在我的 Laravel4 项目中尝试过。函数BelongsTo() 对函数名称没有任何作用。也许您忽略了代码中的某些内容? 所以理论上,在 Book 类中将 author() 更改为 daauthor() ,然后在 foreach 循环中使用 $book0>daauthor 应该返回一些东西?还有什么我可能遗漏的吗? 事实证明,您必须传入外键的名称才能使其工作。你必须这样做吗? 【参考方案1】:

belongsTo 方法试图确定链接到Author 模型的属性。为了完成这个,Laravel 使用调用者的函数名。

因此,在您的代码中,Laravel 看到 daauthor 函数并尝试使用 books 表中的属性 daauthor_id 来满足您的请求。由于您的 books 表没有此属性,因此它会失败。

通过在方法上设置 $foreignKey,您可以覆盖默认行为:

public function daauthor()

    return $this->belongsTo('Author', 'author_id');

更多详情请查看\Illuminate\Database\Eloquent\Model的源代码。

【讨论】:

以上是关于Laravel Eloquent ORM 关系命名约定的主要内容,如果未能解决你的问题,请参考以下文章

Laravel五大功能之Eloquent关系模式

Laravel Eloquent ORM查询关系里面的关系

查询关系 Laravel Eloquent ORM

使用 sum 与关系 Laravel Eloquent ORM

Laravel Eloquent ORM 无法正确返回模型的关系

Laravel之Eloquent ORM