Php 如何在Laravel中对相关模型使用即时加载

Php 如何在Laravel中对相关模型使用即时加载,php,laravel,orm,laravel-5,eloquent,Php,Laravel,Orm,Laravel 5,Eloquent,我有以下型号: 约会[属于时间段|属于用户] 时隙[有许多约会] 用户[有一个约会|有一个详细信息] 详细信息[属于用户] 我正在尝试使用以下查询从约会模型(约会有一个用户,该用户有一个详细记录)开始加载详细信息数据: $apps = Appointment::with('timeslot')->with('user')->with('user.details')->get(); 这会在Builder.php中引发以下错误 对非对象调用成员函数addagerConstra

我有以下型号:

  • 约会[属于时间段|属于用户]
  • 时隙[有许多约会]
  • 用户[有一个约会|有一个详细信息]
  • 详细信息[属于用户]
我正在尝试使用以下查询从约会模型(约会有一个用户,该用户有一个详细记录)开始加载详细信息数据:

$apps = Appointment::with('timeslot')->with('user')->with('user.details')->get();
这会在Builder.php中引发以下错误

对非对象调用成员函数addagerConstraints()

为什么我在这里调用非对象,为什么我的查询不起作用

编辑:

这是我的用户模型上的关系:

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,但在其他调用中工作正常。这是怎么回事

确保在所有关系方法中都有return。其中一个似乎没有返回关系定义


您不能在关系定义中使用$this-在生成查询时,模型的属性将是未初始化的,因此$this->role\u 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;

您不能在关系定义中使用$this-在生成查询时,模型的属性将是未初始化的,因此$this->role\u id将为null,并且不会返回任何关系。那么实现这一点最优雅的方法是什么?我有一个在用户表上运行的用户模型。每个记录都与候选人或雇主表有关系。我将定义两个单独的关系,并定义一个getter,对于给定的用户,它将根据角色返回任何一个相关字段。