1

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
James Risner
  • 5,451
  • 11
  • 25
  • 47
buczo
  • 15
  • 5
  • Do you have any **specific** question about this? Anything not working? Also, how would you define the "best relation"? – Nico Haase Oct 24 '22 at 18:20
  • any specific question about this? Anything not working? Also, how would you define the "best relation" 1: How to get key from user model. 2: I do not know how to get key from user model. 3: corrected – buczo Oct 24 '22 at 19:01

2 Answers2

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

didene tahi
  • 420
  • 3
  • 7
0

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(‘App\Models\Keys’, ‘App\Models\Phone’, ‘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 :))

Sumit kumar
  • 402
  • 2
  • 10