Koleksi Laravel: hanya mengembalikan hubungan dan kunci

Saya mempunyai koleksi yang menyerupai ini:

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

Ini mengembalikan koleksi berikut:

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

Apa yang saya coba lakukan adalah memasukkan item induk berdasarkan idnya dan hanya mengembalikan hubungannya. Misalnya

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

Sepertinya saya tidak bisa membuat ini berhasil. Saya telah mencoba banyak variasi termasuk:

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

Ini tidak berfungsi karena 'Pluck' jelas mencari properti model induk dengan nama 'sub' yang tidak keluar. Apakah ada cara untuk mencapai hal ini?

Terima kasih


person Typhoon101    schedule 04.09.2017    source sumber


Jawaban (2)


Anda hampir sampai. Anda harus melakukan ->get() sebelum pluck().

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

pluck() yang digunakan dalam contoh Anda akan menjadi versi pembuat kueri pluck, bukan versi koleksi.

person Rwd    schedule 04.09.2017
comment
Solusi ini tidak menyimpan kunci 'sub' di hasil. Namun, dalam situasiku yang sebenarnya, hal ini tidak menjadi masalah. Terima kasih - person Typhoon101; 04.09.2017
comment
@ Typhoon101 Versi Laravel apa yang Anda gunakan? - person Rwd; 04.09.2017

gunakan keyBy untuk menggunakan pk Anda sebagai indeks array. https://laravel.com/docs/5.4/collections#method-keyby

Namun mengabaikan bidang lain Anda mungkin memerlukan each dan filter. Bukankah lebih mudah untuk memilih Sub::where(...) dan kemudian menggunakan koleksi groupBy pada parent_id: https://laravel.com/docs/5.4/collections#method-groupby

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

person zapdev    schedule 04.09.2017