laOvel对hasOne的addEagerConstraints

时间:2017-05-19 20:55:22

标签: laravel eloquent

在这里遇到一些Laravel问题。

我有3个型号:

通知

  • ID
  • 消息
  • SENDER_ID
  • recipient_id
  • 等。

参与者

  • ID
  • USER_ID
  • 等。

用户

  • ID
  • 名称
  • 等。

通知可以使发件人(sender_id)和收件人(recipient_id)都引用参与者表。 参与者具有对用户(user_id)的引用。

我正在尝试使用以下代码获取发件人和收件人的通知列表。

public function sender()
{
    return $this->hasOne('App\Models\Participant', 'sender_id', 'id')->with(['user']);
}

public function recipient()
{
    return $this->hasOne('App\Models\Participant', 'id', 'recipient_id')->with(['user']);
}

返回空结果     [关系:受保护] =>排列         (             [sender] =>             [收件人] =>         )

将代码更改为:

public function sender()
{
    return $this->hasOne('App\Models\Participant', 'sender_id', 'id')->with(['user'])->first();
}

public function recipient()
{
    return $this->hasOne('App\Models\Participant', 'id', 'recipient_id')->with(['user'])->first();
}

我得到了

  

“调用未定义的方法Illuminate \ Database \ Query \ Builder :: addEagerConstraints()”

2 个答案:

答案 0 :(得分:0)

首先,让你的模型更清洁,然后在那里写下关系逻辑。

public function sender()
{
    return $this->hasOne('App\Models\Participant');
}
public function recipient()
{
    return $this->hasOne('App\Models\Participant');
}

现在,在您的控制器中,您编写了逻辑:

$sender = YourModel::sender()->where('sender_id', $id)->first();

希望这有帮助。

答案 1 :(得分:0)

您的关系设置不正确。由于notifications表具有外键(sender_idrecipient_id),因此可以说Notification属于Participant,而{{1}有一个或多个Participant s。

您需要将Notification模型上的关系更新为Notification关系:

belongsTo

一对夫妇注意到:

  1. 由于您没有显示您的参与者/用户关系,因此请确保将其定义为"参与者属于用户,用户有一个或多个参与者"。这就是您的数据库的设置方式。

  2. 您在第二次尝试时遇到的错误("调用未定义的方法")是因为关系方法必须返回public function sender() { return $this->belongsTo(Participant::class); } public function recipient() { return $this->belongsTo(Participant::class); } 实例。通过调用Relation,您实际上是在执行查询并返回first(),这是不允许的。