Janiis
Janiis

Reputation: 1576

Relationship through one model

I have three tables - users, properties, devices.

users
 id
 name

properties
 id
 name
 user_id

devices
 id
 name
 property_id

How to define straight relationship to user model from devices model?

class Device extends Model
{
    public function user()
    {
        return $this->....();
    }
}

Is it possible to define such relation? Thanks.

Upvotes: 0

Views: 92

Answers (3)

Janiis
Janiis

Reputation: 1576

I think I have found the solution, this is what I end up with.

class Device extends Model
{
    public function user()
    {
        $instance = new User();
        $instance->setTable('properties');
        $query = $instance->newQuery();

        return (new BelongsTo($query, $this, 'property_id', $instance->getKeyName(), 'property'))
                    ->join('users', 'users.id', '=', 'properties.user_id')
                    ->select(DB::raw('users.*')
            );
    }
}

Hope this will be of help for somebody.

Upvotes: 0

Can Celik
Can Celik

Reputation: 2087

Make sure to set all relation in other classes.

class Property extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}
class Device extends Model
{
    public function property()
    {
        return $this->belongsTo('App\Property');
    }

    public function user()
    {
        return $this->belongsTo('App\User', null, null, 'property');
    }
}

You can provide a relation with in 4th parameter of belongsTo method.

Upvotes: 2

Delwar
Delwar

Reputation: 1

   //user model
    public function role()
    {
        return $this->belongsTo('App\Role');
    }
    public function employee()
    {
        return $this->hasMany('App\Employee');
    }
   //role model
    public function users()
    {
        return $this->hasMany('App\User');
    }
    //employee model
    public function users()
    {
        return $this->belongsTo('App\User');
    }
    //value show using tinker command in command promote
     App\User::find(1)->employee;
     App\User::find(1)->role;

Upvotes: 0

Related Questions