Search code examples
functionlaravelforeign-key-relationshipparentheses

laravel - why function call with no parentheses?


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


Solution

  • 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.