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,对于给定的用户,它将根据角色返回任何一个相关字段。