คอลเลกชัน 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
โซลูชันนี้ไม่เก็บคีย์ 'ย่อย' ไว้ในผลลัพธ์ อย่างไรก็ตาม ในสถานการณ์จริงของฉัน นี่ไม่ใช่ปัญหา ขอบคุณ - 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