如何在Laravel中使用热切加载相关模型

时间:2016-01-13 09:49:11

标签: php laravel orm laravel-5 eloquent

我有以下型号:

  • 预约[belongsTo Timeslot | belongsTo用户]
  • Timeslot [hasMany Appointment]
  • 用户[hasOne预约| HasOne详情]
  • 详情[belongsTo用户]

我正在尝试使用以下查询从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,但在其他调用中它可以正常工作。这里发生了什么?

1 个答案:

答案 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;