我在laravel教程中看到了这一点:
Auth::user()->item;
其中item是一个函数,在models \ User.php:
中function item() { return $this->hasMany('Item', 'owner_id'); }
其中Item用于models \ Item.php
那么为什么在调用item函数时不需要括号?喜欢:Auth::user()->item();
如果我把括号括起来,那么浏览器会变得疯狂并崩溃。
另外,如果我将Item.php重命名为Item2.php,将类Item重命名为Item2,而我hasMany('Item2', 'owner_id')
,则无效。但为什么 ? 'Item'来自哪里?
谢谢,
帕特里克
答案 0 :(得分:8)
Laravel使用魔术函数__get
来处理任意属性。
这将调用Illuminate\Database\Eloquent\Model
的{{1}}函数,该函数检查模型的关系,并在与该名称存在关系时返回相关项。
不需要括号,因为getAttribute
在请求属性getAttribute
时自动执行函数items()
。顺便说一下,您可以请求items
,它将返回您可以使用的查询构建器。
答案 1 :(得分:1)
方法item()
正在为Eloquent ORM建立关于如何准备查询的关系。调用->item
告诉Eloquent通过其Dynamic Properties你想要Item,然后Eloquent将使用该方法。如果方法与Query Builder兼容,则只能直接调用该方法。您给出的示例应该以任何方式工作,但可能会有一些我遗漏的东西。