2016-04-14 11 views
0

Ich erhalte eine Reihe von Kategorien mit verwandten Fragen mit Laravel 5.1.Abflachen Array von Objekten in Array von angegebenen Wert

möchte ich nur die IDs der verschachtelten Fragen, aber die select zur Arbeit zu kommen, muss ich die Verknüpfungsspalte angeben, auch bekannt als category_id:

$categories = Category::with(['questions'=>function($query){ 
     $query->select('id', 'category_id'); 
    }])->get(); 

Das bekommt mir:

[ 
{ 
    "id": 1, 
    "category": "Anatomy", 
    "created_at": "2016-04-13 00:46:12", 
    "updated_at": "2016-04-13 00:46:12", 
    "questions":[ 
    {"id": 1, "category_id": 1}, 
    {"id": 2, "category_id": 1}, 
    {"id": 3, "category_id": 1}, 
    {"id": 4, "category_id": 1}, 
    ... 
    ] 
}, ... 
] 

Wie kann ich questions : [ nur die IDs anstelle von Objekten enthalten, so dass es sein würde:

[ 
{ 
    "id": 1, 
    "category": "Anatomy", 
    "created_at": "2016-04-13 00:46:12", 
    "updated_at": "2016-04-13 00:46:12", 
    "questions":[ 
    1, 2, 3, 4 ... 
    ] 
}, ... 
] 

Ich habe versucht, mithilfe der Karte zu sammeln und die IDs aufzulisten. Dies funktioniert nicht:

$test = collect($categories)->map(function ($q) { 
     return collect($q)->lists('id')->toArray(); 
    }); 

Ich würde es vorziehen, diese hier zu behandeln, damit ich mit ihm nicht auf dem Frontend beschäftigen muß.

+0

Betrachten Sie die Verwendung von Präsentatoren, um Ihren Code zu DRY. Hier ist eins: https://github.com/thephleague/fractal – Mysteryos

Antwort

0

Hier ist eine einfache Möglichkeit, es zu tun.

Hier ist ein Beispieldaten nach Ihren Daten, die es nur

replizieren
[ 
{ 
    "id": 1, 
    "category": "Anatomy", 
    "created_at": "2016-04-13 00:46:12", 
    "updated_at": "2016-04-13 00:46:12", 
    "questions":[ 
    {"id": 1, "category_id": 1}, 
    {"id": 2, "category_id": 1}, 
    {"id": 3, "category_id": 1}, 
    {"id": 4, "category_id": 1} 
    ] 
} 
] 

hier ist der PHP-Code

# JSON DATA 
$data = '[ 
{ 
    "id": 1, 
    "category": "Anatomy", 
    "created_at": "2016-04-13 00:46:12", 
    "updated_at": "2016-04-13 00:46:12", 
    "questions":[ 
    {"id": 1, "category_id": 1}, 
    {"id": 2, "category_id": 1}, 
    {"id": 3, "category_id": 1}, 
    {"id": 4, "category_id": 1} 
    ] 
} 
]'; 

# convert to array 
# $data = json data 
$categories = json_decode($data, true); 

# assuming the categories has a list of object 
# so i need to override it all 
foreach ($categories as $key => $category) { 

    # map a new array 
    $list = array_map(function ($data) { 
     return $data['id']; 
    }, $category['questions']); 
    # assign it to the current object being 
    # iterated the new array created from 
    # the array_map 
    $categories[$key]['questions'] = $list; 

} 

die Ausgabe wie diese, wenn Sie

[ 
    { 
    "id": 1, 
    "category": "Anatomy", 
    "created_at": "2016-04-13 00:46:12", 
    "updated_at": "2016-04-13 00:46:12", 
    "questions": [ 
     1, 
     2, 
     3, 
     4 
    ] 
    } 
] 

aussehen Verwenden Sie die json_encode ($ categories) in J sein SON FORMAT

Hoffe es hilft.