Laravel 集合:仅返回关系和键

问题描述 投票:0回答:2

我有一个与此类似的集合:

$a = Model::with(['sub' => function($q) {
    $q->select('id', 'name')
}])->get();

这将返回以下集合:

{
    0: {
        id: 0001,
        name: "item 1",
        type: "type a"
        'sub' [
            {
                'id': 10001,
                'name': "sub Item 1"
            },
            {
                'id': 10002,
                'name': "sub Item 2"
            }
        ]
    },
    1: {
        id: 0002,
        name: "item 2",
        type: "type a"
        'sub' [
            {
                'id': 11001,
                'name': "sub Item 4"
            },
            {
                'id': 11002,
                'name': "sub Item 5"
            }
        ]
    }

我想要做的是通过父项的 id 键入父项的键,并仅返回关系。例如

{
    0001: {
        'sub' [
            {
                'id': 10001,
                'name': "sub Item 1"
            },
            {
                'id': 10002,
                'name': "sub Item 2"
            }
        ]
    },
    0002: {
        'sub' [
            {
                'id': 11001,
                'name': "sub Item 4"
            },
            {
                'id': 11002,
                'name': "sub Item 5"
            }
        ]
    }

我似乎无法让它发挥作用。我尝试了很多变化,包括:

$a = Model::with(['sub' => function($q) {
    $q->select('id', 'name')
}])->pluck('sub', 'id');

这不起作用,因为“Pluck”显然正在寻找名称为“sub”的父模型的属性,该属性不存在。有没有办法实现这个目标?

php laravel collections pluck
2个回答
8
投票

你就快到了。您需要在

->get()
之前执行
pluck()

$a = Model::with([
    'sub' => function ($q) {
        $q->select('id', 'name');
    },
])->get()->pluck('sub', 'id');

示例中使用的

pluck()
将是
pluck
的查询生成器版本,而不是集合版本。


0
投票

使用

keyBy
使用你的 pk 作为数组索引。 https://laravel.com/docs/5.4/collections#method-keyby

但是忽略其他字段,您可能需要

each
filter
。选择
Sub::where(...)
然后在parent_id上使用集合
groupBy
不是更容易吗:https://laravel.com/docs/5.4/collections#method-groupby

所以类似

Sub::where(...)->get()->groupBy('parent_id')

© www.soinside.com 2019 - 2024. All rights reserved.