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

时间:2017-01-13 15:45:05

标签: php postgresql laravel eloquent psql

嘿,我怎样才能在两张桌子之间建立关系。

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

我想通过user_id和client_id建立用户和通知之间的关系。 然后,我将获得分配给已登录用户的所有通知,并获取发件人用户的电子邮件。

我做到了:

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

但是当我使用查询时,我收到了很好的通知,但邮件错误。 我从ralationship id(来自users表)== id(来自通知表)

收到了电子邮件

我的查询

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

有人知道我做错了吗?

3 个答案:

答案 0 :(得分:1)

您可以通过定义以下关系来尝试:

User模型

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

Notification模型

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

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

然后您可以将其查询为:

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

或者,如果您只是想email,请将其查询为:

$notifications = auth()->user()
                    ->notifications()
                    ->with(['from' => function($q) {
                        $q->select('email');
                    }])
                    ->get();

答案 1 :(得分:0)

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

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

使用通知模型中的此代码,您可以使用

获取已登录的用户
$this->user(); // $notification->user();

和发件人

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

答案 2 :(得分:0)

您无法使用$this->hasManyThrough().用于different reason

您可以像这样使用$this->belongsTo()

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

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

然后你可以查询。

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

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