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 关系命名约定的主要内容,如果未能解决你的问题,请参考以下文章
使用 sum 与关系 Laravel Eloquent ORM