arun
arun

Reputation: 4815

Laravel pluck an array from nested relationship

I need to get only the roomnumber arrays returned from the following query:

$roomnumbers = Room::with(['floorroomcount' => function($query){
                $query->with('roomnumber')->get();
        }])->where('roomtype_id', $roomtype_id)->get();

Tried: The follow pluck is returning floorroomcount

$roomnumbers->pluck('floorroomcount');

but i need roomnumber array, how can i get?

Upvotes: 8

Views: 24179

Answers (5)

Abbas Arif
Abbas Arif

Reputation: 390

In Laravel 5.1 and + you can use flatten() on collection.

method flattens a multi-dimensional collection into a single dimension:

$roomnumbers->flatten()->pluck('floorroomcount');

Upvotes: 0

Steen Schütt
Steen Schütt

Reputation: 1504

You may shorten @Jonas Staudenmeir's answer like so:

$roomnumbers->pluck('floorroomcount.*.roomnumber.*')->collapse();

pluck('*') is essentially the same as collapse() in this particular context.

Upvotes: 8

Dev
Dev

Reputation: 6710

Try,

$roomnumbers = Room::with(['floorroomcount' => function($query){
    $query->with('roomnumber')->get();
}])
->where('roomtype_id', $roomtype_id)
->get();

$records = $roomnumbers->map(function($element, $value){
    return $element->map(function($e, $v){
        return $e->roomnumber;
    });
})->values()->all();

map() is a Laravel collection method so you need to import the collection facade on the top of the controller like: use Illuminate\Support\Collection;

Upvotes: 0

Jonas Staudenmeir
Jonas Staudenmeir

Reputation: 25906

This gives you all roomnumber results in one collection:

$roomnumbers->pluck('floorroomcount')->collapse()->pluck('roomnumber')->collapse();

Upvotes: 30

arun
arun

Reputation: 4815

This is working, but with many loop and echoing directly, if anything can be simplified please let me know :

   $roomnumbers = Room::with(['floorroomcount.roomnumber'])->where('roomtype_id', $roomtype_id)->get();

    $floorroomcounts =  $roomnumbers->pluck('floorroomcount');

    $records =  $floorroomcounts->map(function($floorroomcount, $value){

                    return $floorroomcount->pluck('roomnumber')->flatten();

                })->values()->all();        

    foreach($records as $record){

        foreach($record as $row){
            echo '<option value='.$row->id.'>'.$row->roomnumber.'</option>';
        }

    }

    //return response()->json($roomnumbers);

Upvotes: 1

Related Questions