【发布时间】:2016-08-07 08:03:44
【问题描述】:
问题详情:
我有三个模型
- 带有
id和name字段的Directorate, -
Employee与id和name字段和 -
Telephone与id、tel、employee_id、directorate_id、description和type字段。employee_id可以为空,即数据库中存储有带有employee_id = null的电话
模型相关如下:
- 一个员工可能有很多电话
-
一个董事会,可能有很多电话
class Directorate extends Model { public function telephones() { return $this->hasMany(Telephone::class); } public function employees() { return $this->hasMany(Employee::class); } } class Employee extends Model { public function telephones() { return $this->hasMany(Telephone::class); } public function directorate() { return $this->belongTo(Directorate::class); } } class Telephone extends Model { public function employee() { return $this->belongsTo(Employee::class); } public function directorate() { return $this->belongsTo(Directorate::class); } }
问题:
我想获取属于特定Directorate 的所有Telephone 模型的集合,这些模型具有employee_id = null 并且还急切加载了它们的directorate 关系。此外,从生成的 Telephone 模型集合中,我只需要模型的一些字段,即 id、tel 和 description
尝试
到目前为止,我尝试了以下内容:
我在电话模型中创建了一个查询范围:
public function scopeHaveNoEmployeeId($query)
{
return $query->where('telephones.employee_id', '=', null);
}
在我的控制器中
$myTelephones = Telephone::with('directorate')
->haveNoEmployeeId()
->where('directorate_id', $directorateId)
->get(['id', 'tel', 'description']);
但是,我收到的是过滤模型的请求字段,没有预先加载关系,例如:
[
{
"id": 79,
"tel": "0648136867",
"directorate": null
},
{
"id": 380,
"tel": "0223796011",
"directorate": null
}
]
之后我也尝试延迟加载关系,但没有运气。
最后我注意到,如果我请求所有电话模型字段,则关系将在我请求时急切加载。例如:
$myTelephones = Telephone::with('directorate')
->haveNoEmployeeId()
->where('directorate_id', $directorateId)
->get();
那么结果:
[
{
"id": 79,
"tel": "0648136867",
"directorate": {
"id": 23
"name": "Some name"
}
},
{
"id": 380,
"tel": "0223796011",
"directorate": {
"id": 23
"name": "Some name"
}
}
]
【问题讨论】:
标签: laravel eloquent query-builder eager-loading