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
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.Laravel uses the magic function
__get
to handle arbitrary attributes.This calls
Illuminate\Database\Eloquent\Model
'sgetAttribute
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 functionitems()
when the attributeitems
is requested. You can, by the way, requestAuth::user()->item();
which will return a query builder you can work with.