Коллекция Laravel: вернуть только отношение и ключ

У меня есть коллекция, похожая на эту:

$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"
            }
        ]
    }

То, что я пытаюсь сделать, это указать родительские элементы по их идентификаторам и только вернуть отношения. Например

{
    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», которое не выходит. Есть ли способ добиться этого?

Спасибо


person Typhoon101    schedule 04.09.2017    source источник


Ответы (2)


Ты был почти там. Вам нужно будет сделать ->get() до pluck().

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

pluck(), используемый в вашем примере, будет версией pluck построителя запросов, а не версией коллекции.

person Rwd    schedule 04.09.2017
comment
Это решение не сохраняет ключ «sub» в результатах. Однако в моей реальной ситуации это не проблема. Спасибо - person Typhoon101; 04.09.2017
comment
@ Typhoon101 Какую версию Laravel вы используете? - person Rwd; 04.09.2017

используйте keyBy, чтобы использовать ваш pk в качестве индекса массива. https://laravel.com/docs/5.4/collections#method-keyby

Однако, игнорируя другие поля, вам, вероятно, понадобятся each и filter. Не проще ли выбрать Sub::where(...), а затем использовать коллекцию groupBy для parent_id: https://laravel.com/docs/5.4/collections#method-groupby

Что-то вроде Sub::where(...)->get()->groupBy('parent_id')

person zapdev    schedule 04.09.2017