Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why eloquent model relationships do not use parenthesis and how do they work?

I kept searching the web for an hour but couldn't figure this out. If we look at the eloquent relationships documentation: https://laravel.com/docs/5.2/eloquent-relationships

The example User model:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

Just below it, how to access the phone number of a user with id=1:

$phone = User::find(1)->phone;

Why is it phone and not phone() and what is the difference?

Also how does it work? If I try to call an object->name without parenthesis in my code PHP thinks I am looking for a class variable named name?

Some extra information:

It looks like phone is returning object(App\Models\Phone) and phone() is returning object(Illuminate\Database\Eloquent\Relations\HasOne)

If I run the code below:

User::find(1)->phone->count()

Framework executes following SQL statements:

select * from `phone` where `phone`.`user_id` = '1' and `phone`.`user_id` is not null limit 1
select count(*) as aggregate from `phone`

If I run the code below:

User::find(1)->phone()->count()

Framework executes following SQL statement:

select count(*) as aggregate from `phone` where `phone`.`user_id` = '1' and `phone`.`user_id` is not null
like image 901
Evren Yurtesen Avatar asked May 18 '16 19:05

Evren Yurtesen


People also ask

What is with () in Laravel?

with() function is used to eager load in Laravel. Unless of using 2 or more separate queries to fetch data from the database , we can use it with() method after the first command. It provides a better user experience as we do not have to wait for a longer period of time in fetching data from the database.

How many types of relationships are there in Laravel?

One To One (Polymorphic) One To Many (Polymorphic) Many To Many (Polymorphic)

What do you understand by eloquent ORM?

Eloquent is an object relational mapper (ORM) that is included by default within the Laravel framework. An ORM is software that facilitates handling database records by representing data as objects, working as a layer of abstraction on top of the database engine used to store an application's data.

What is BelongsTo in Laravel?

BelongsTo is a inverse of HasOne. We can define the inverse of a hasOne relationship using the belongsTo method. Take simple example with User and Phone models. I'm giving hasOne relation from User to Phone. class User extends Model { /** * Get the phone record associated with the user.


1 Answers

One way of thinking about it is that the public function phone() function defines the relationship, so using $obj->phone() would get you the Eloquent relationship itself (not the results of that relationship) which you could then modify with various query builder elements if you wanted.

Leaving out the brackets is the Eloquent shorthand for adding ->get() or ->first() at the end of the expression (Eloquent knows which to use based on if it's a hasOne, hasMany, etc. relationship, as defined in the function), which returns an Eloquent collection.

So, $obj->phone is the same as $obj->phone()->first().

like image 58
McHobbes Avatar answered Oct 20 '22 01:10

McHobbes