laravel - why function call with no parentheses?

十年热恋 提交于 2019-12-10 02:06:36

问题


I see this in a laravel tutorial :

Auth::user()->item;

where item is a function, inside models\User.php :

function item() { return $this->hasMany('Item', 'owner_id'); }

where Item is for models\Item.php

So why the parentheses is not needed when item function is called ? Like : Auth::user()->item(); If I put the parentheses, the browsers goes crazy and crash.

Also, if I rename Item.php to Item2.php, rename class Item to Item2, and I do hasMany('Item2', 'owner_id'), it won't work. But why ? Where does 'Item' came from ?

Thanks,

Patrick


回答1:


Laravel uses the magic function __get to handle arbitrary attributes.

This calls Illuminate\Database\Eloquent\Model's getAttribute function, which checks the model's relations and returns the related item(s) if a relationship is present with that name.

The parentheses are not needed because getAttribute automatically executes the function items() when the attribute items is requested. You can, by the way, request Auth::user()->item(); which will return a query builder you can work with.




回答2:


The method item() is setting up a relationship for the Eloquent ORM on how to prepare a query. calling ->item is telling Eloquent through its Dynamic Properties that you want Item and then Eloquent will use the method. You can only call the method directly if it is compatible with Query Builder. The example you give should work either way but there may be something I am missing.



来源:https://stackoverflow.com/questions/26512186/laravel-why-function-call-with-no-parentheses

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!