如何从Eloquent中的嵌套关​​系中选择特定字段

时间:2018-05-09 09:44:55

标签: php laravel-5 eloquent

我在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

2 个答案:

答案 0 :(得分:1)

正如其他人之前所说,您需要在选择的值中包含外键。假设我们有两个模型。 ParentChild。这是您必须选择的最低要求。

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