skip to Main Content

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

2

Answers


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

    Login or Signup to reply.
  2. Since a user can have only one phone (as mentioned) and phone has one key you have to use hasOneThrough() relation in model A.

    Functions:

    Public function getKey()
    {
        Return $this->hasOneThrough(‘AppModelsKeys’, ‘AppModelsPhone’, ‘foreignKey on Phones’, ‘foreignKey on Keys’);
    }
    

    Note: For this to work you have to pick top to down approach so make migrations like this User->Phones->Keys.

    There is another package that allow belongsToThrough i think its called haven’t used it tho if you want to look into reverse relation lookup (idk why someone need that :))

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search