Search code examples
laraveleloquent-relationship

How to get a value from a three-level depth relation in Laravel using Eloquent?


I have 3 tables as below:

Users Table (has only one phone):

id Name phone_id
1 Sam 1
2 Tom 2
/**
* @return HasOne
*/
public function phone()
{
    return $this->hasOne(phones::class);
}

/**
* @return ???
*/
public function key()
{
    return ???;
}

Phone Table (has only one key):

id Name key_id
1 Nokia 1
2 Samsung 2
/**
* @return HasOne
*/
public function key()
{
    return $this->hasOne(keys::class);
}

Key Table:

id Name
1 asd123
2 qwe345
/**
* @return belongTo
*/
public function phone()
{
    return $this->belongTo(phones::class);
}

I wanted to know how to get the key from the user model:

User::find(1)->key()->Name

Solution

  • you need to work around hasOneThrough to get what you need.

    let's break it down, based on your schema:

    • a User belongs to one Phone
    • a phone belongs to Key
    • therefore, a User belongs to Key through Phone

    making this clear, we need to declare our key relationship inside the User model:

    public function key()
    {
        return $this->hasOneThrough(
            Key::class,       // model we are trying to get
            Phone::class,      // model we have an _id to
            'id',                 // WHERE `phone`.`id` = `user`.`phone_id`
            'id',                 // `key`.`id`
            'phone_id',        // local column relation to our through class
            'key_id'          // `phone`.`key_id`
        );
    }
    

    this will get you directly key from user