Laravel 集合:return 只有关系和键

Laravel collection: return only relationship and key

我有一个类似这样的集合:

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

这 return 是以下合集:

{
    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 来键控父项,并且只有 return 关系。例如

{
    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' 的父模型的 属性,它不会退出。有办法实现吗?

谢谢

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

但是忽略其他字段,您可能需要 eachfilter。 select Sub::where(...) 然后在 parent_id 上使用集合 groupBy 不是更容易吗: https://laravel.com/docs/5.4/collections#method-groupby

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

你快到了。您需要在 pluck().

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

您的示例中使用的 pluck() 将是 pluck 的查询构建器版本,而不是集合版本。