laravel - 为什么函数调用没有括号?

tro*_*gne 10 function foreign-key-relationship parentheses laravel

我在一个laravel教程中看到了这个:

Auth::user()->item;
Run Code Online (Sandbox Code Playgroud)

其中item是一个函数,在models\User.php中:

function item() { return $this->hasMany('Item', 'owner_id'); }
Run Code Online (Sandbox Code Playgroud)

其中Item是models\Item.php

那么为什么在调用item函数时不需要括号?喜欢:Auth::user()->item(); 如果我把括号括起来,浏览器会变得疯狂并崩溃.

此外,如果我将Item.php重命名为Item2.php,将类Item重命名为Item2,我这样做hasMany('Item2', 'owner_id'),它将无法工作.但为什么 ?'Item'来自哪里?

谢谢,

帕特里克

cee*_*yoz 9

Laravel使用魔术函数__get来处理任意属性.

这个电话Illuminate\Database\Eloquent\ModelgetAttribute功能,检查模型的关系,如果有关系存在该名称返回相关的项目(S).

不需要括号,因为在请求属性时getAttribute自动执行该函数.顺便说一句,您可以请求返回可以使用的查询构建器.items()itemsAuth::user()->item();

  • @trogne因为它没有这样编码.`getAttribute`函数专门查找**关系**.所有这些的来源是免费提供的 - https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L2383 - 所以我建议你在那里寻找进一步的答案. (2认同)
  • 谢谢ceejayoz!我知道了解到Laravel在寻找属性的同时,它也在执行具有相同名称的函数。此函数返回类型为“ Illuminate \ Database \ Eloquent \ Relations \ HasMany”的大对象。通过询问该属性,可以得到hasMany的具体含义:“ Illuminate \ Database \ Eloquent \ Collection”对象。 (2认同)