2016-01-13 57 views
1

我有以下型号:如何使用预先加载相关模型Laravel

  • 预约[属于关联时隙| belongsTo User]
  • 时间段[hasMany Appointment]
  • User [hasOne Appointment | HasOne详情]
  • 详细[属于关联用户]

我想急于负荷约会模型开始的详细数据(预约有一个用户,其中有一个详细记录)使用以下查询:

$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,但它在其他调用中正常工作。这里发生了什么?

回答

2

确保您在所有关系方法中都有返回。看起来他们中的一个没有返回关系的定义。

你不能在关系定义中使用$ this--当构建查询时,模型的属性将被忽略,所以$ this-> role_id将给出null,并且不会返回任何关系。

为了使其工作,你应该定义2个独立的关系:

// 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; 
+0

嗯,看在我原来的职位编辑 – matthiasdv

+0

不能使用$此有关的定义 - 模型的属性会当查询被建立时,这是不会启动的,所以$ this-> role_id将会返回null,并且不会返回任何关系。 –

+0

那么实现它的最优雅的方法是什么?我有一个在用户表上运行的用户模型。每个记录_either_与候选人或雇主表有关系。 – matthiasdv