两个表之间的Laravel关系有两个外键

Hey how can I make relationships between two table.

Users: id, email
Notification: id, user_id(id of the logged user), client_id(id of sender)

I would like make relationship between users and notifications by user_id and client_id. Then I will can get all notifications assigned to logged user, and get email of sender users.

I made that:

    public function notifications_with_client() {
    return $this->hasManyThrough('App\Models\User', 'App\Models\Notification', 'user_id', 'id', 'client_id');
}

But when I using query i got good notifications but with wrong email. I got email from ralationship id(from users table) == id(from notifications table)

My query

$column = 'notifications_with_client';
$value[1] = ['email', 'notifications.id', 'client_id'];
$query->with([$column => function($query) use ($value) {
                      $query->select($value[1]);
                  }]);

Someone know what I do wrong?

You can try it by defining the following relations:

User Model

public function notifications()
{
    return $this->hasMany('App\Models\Notification');
}

Notification Model

public function to()
{
  return $this->belongsTo('App\Models\User', 'user_id');
}

public function from()
{
  return $this->belongsTo('App\Models\User', 'client_id');
}

And then you can query it as:

$notifications = auth()->user()->notifications()->with('from')->get();

Or if you just want email then query it as:

$notifications = auth()->user()
                    ->notifications()
                    ->with(['from' => function($q) {
                        $q->select('email');
                    }])
                    ->get();
public function user()
{
    return $this->belongsTo(Users::class, 'user_id');
}

public function client()
{
    return $this->belongsTo(Users::class, 'client_id');
}

With this code in your Notification Model you can get the logged user with

$this->user(); // $notification->user();

and the sender with

$this->client(); //$notification->client();

You cannot use $this->hasManyThrough(). It use for a different reason

You can use $this->belongsTo() like this.

class User extends BaseModel
{
    public function user()
    {
        return $this->belongsTo(Notification::class, 'user_id');
    }

    public function client()
    {
        return $this->belongsTo(Notification::class, 'client_id');
    }
}

Then you can query like.

User::with(['user']);

or

User::with(['client']);