我在Eloquent中有以下查询:
public function firstSubsectionIdsOnly()
{
return $this->model->with(['sections' => function ($q) {
$q->with(['subsections' => function ($q2) {
$q2->first();
}
])->first();
}])->whereHas('sections.subsections')->first();
}
返回如下内容:
{
"id": 1,
"name": "Training exercise",
"entry": "<p>sss</p>",
"created_at": "2018-04-20 09:38:36",
"updated_at": "2018-04-20 10:08:27",
"sections": [
{
"id": 1,
"name": "Section 1 Training",
"parent": null,
"position": 1,
"created_at": "2018-05-04 09:37:23",
"updated_at": "2018-05-04 09:37:23",
"pivot": {
"training_exercise_id": 1,
"section_id": 1
},
"subsections": [
{
"id": 2,
"name": "Subsection 1 training",
"parent": 1,
"created_at": "2018-05-04 09:54:09",
"updated_at": "2018-05-04 09:54:09"
}
]
}
]
}
我希望它只为每个关系选择id字段,所以它应该返回如下内容:
{
"id": 1,
"name": "Training exercise",
"entry": "<p>sss</p>",
"created_at": "2018-04-20 09:38:36",
"updated_at": "2018-04-20 10:08:27",
"sections": [
{
"id": 1,
"subsections": [
{
"id": 2,
}
]
}
]
}
我尝试将$q->select('id');
添加到subsections
嵌套的闭包中,但会返回一个空的subsections
数组。
有关如何实现这一目标的任何想法?我正在使用Laravel 5.6
答案 0 :(得分:1)
正如其他人之前所说,您需要在选择的值中包含外键。假设我们有两个模型。 Parent
和Child
。这是您必须选择的最低要求。
App\Parent::select('id')->with(['children' => function ($query) {
$query->select('id', 'parent_id');
}])->get();
它为您带来类似的体验
Illuminate\Database\Eloquent\Collection {
all: [
App\Parent {
id: 1,
children: Illuminate\Database\Eloquent\Collection {
all: [
App\Child {
id: 109,
parent_id: 1,
},
App\Child {
id: 153,
parent_id: 1,
},
],
},
},
],
}
如果您要求逆,则仍然需要外键,就像这样
App\Child::select('id', 'parent_id')->with('parent' => function ($query) {
$query->select('id');
}])->get();
这使您网
Illuminate\Database\Eloquent\Collection {
all: [
App\Child {
id: 1,
parent_id: 58,
parent: App\Parent {
id: 58,
},
},
],
}
为了查询的易读性,我使用select()
而不是get()
,但是您必须使用select()
进行子查询。
如果您使用with('relation') => function ($query) { $query->get(['id']); }
,则会得到整个对象。
答案 1 :(得分:0)
您必须包含外键列。对于subsections
关系:
$q2->select('id', 'parent');