如何 return 具有选定列和关系的模型集合急切地加载到 Laravel 5.2
How to return a collection of models with selected columns and relation eager loaded in Laravel 5.2
问题详情:
我有三个模型
- 具有
id
和 name
字段的 Directorate
,
- 具有
id
和 name
字段和 的 Employee
- a
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
关系.此外,从电话模型的结果集合中,我只需要模型的一些字段,即 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"
}
}
]
您的电话与首长型号没有任何关系。
将其放入您的电话模型中。
public function directorate()
{
return $this->belongsTo(Directorate::class);
}
实际上,在深入了解 Laravel 的详细信息一段时间后,我发现我最初的问题断章取义而且有些愚蠢。我首先急切地加载了一个关系,然后愚蠢地通过不将它包含在 get() 参数中来过滤掉了关系。我只需要执行以下操作:
$myTelephones = Telephone::with('directorate')
->haveNoEmployeeId()
->where('directorate_id', $directorateId)
->get(['id', 'tel', 'description', 'directorate']);
问题详情:
我有三个模型
- 具有
id
和name
字段的Directorate
, - 具有
id
和name
字段和 的 - a
Telephone
与id
、tel
、employee_id
、directorate_id
、description
和type
字段。employee_id
可以为空,即数据库中存储了employee_id = null
的电话
Employee
模型关联如下:
- 一个员工可能有很多部电话
一个局,可能有很多电话
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
关系.此外,从电话模型的结果集合中,我只需要模型的一些字段,即 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"
}
}
]
您的电话与首长型号没有任何关系。 将其放入您的电话模型中。
public function directorate()
{
return $this->belongsTo(Directorate::class);
}
实际上,在深入了解 Laravel 的详细信息一段时间后,我发现我最初的问题断章取义而且有些愚蠢。我首先急切地加载了一个关系,然后愚蠢地通过不将它包含在 get() 参数中来过滤掉了关系。我只需要执行以下操作:
$myTelephones = Telephone::with('directorate')
->haveNoEmployeeId()
->where('directorate_id', $directorateId)
->get(['id', 'tel', 'description', 'directorate']);