我有以下型号:
我正在尝试使用以下查询从Appointment模型(约会有一个用户,其中包含详细信息记录)开始加载详细信息数据:
$apps = Appointment::with('timeslot')->with('user')->with('user.details')->get();
这会在Builder.php
中引发以下错误在非对象
上调用成员函数addEagerConstraints()
为什么我在这里调用非对象?为什么我的查询不起作用?
编辑:
这是我的用户模型上的关系:
public function details() {
dd($this->role_id);
switch($this->role_id) {
case 3:
return $this->hasOne('App\CandidateDetails', 'user_id');
break;
case 2:
return $this->hasOne('App\EmployerDetails', 'user_id');
break;
}
}
我知道使用数据透视表可以更好地实现这一点,这是一个学习过程。当我的查询调用时,dd()返回null,但在其他调用中它可以正常工作。这里发生了什么?
答案 0 :(得分:2)
确保所有关系方法都返回。似乎其中一个没有返回关系定义。
您无法在关系定义中使用$ this - 在构建查询时,模型的属性将不被启用,因此$ this-> role_id将为null,并且不会返回任何关系。
为了使其有效,你应该定义两个独立的关系:
// User.php
public function candidateDetails() {
return $this->hasOne('App\CandidateDetails', 'user_id');
}
public function cemployerDetails() {
return $this->hasOne('App\EmployerDetails', 'user_id');
}
public function getDetailsAttribute() {
switch($this->role_id) {
case 3:
return $this->candidateDetails;
case 2:
return $this->employerDetails;
}
}
// ...and then...
$user = User::with('candidateDetails', 'employerDetails')->findOrFail($userId);
// depending on user's role you'll get either candidate or employer details here
$details = $user->details;