如何 return 具有选定列和关系的模型集合急切地加载到 Laravel 5.2

How to return a collection of models with selected columns and relation eager loaded in Laravel 5.2

问题详情:

我有三个模型

模型关联如下:

问题:

我想获取属于特定 Directorate 的所有 Telephone 模型的集合,这些模型具有 employee_id = null 并且还具有急切加载的 directorate 关系.此外,从电话模型的结果集合中,我只需要模型的一些字段,即 idteldescription

尝试

到目前为止我尝试的是以下内容:

我在电话模型中创建了一个查询范围:

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']);