Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prepend Laravel Eloquent Collection array with a key-value pair?

I'm fetching something from database:

$foo = $this->fooRepository->all()->lists('name', 'id');

I get:

Collection {#506 ▼
  #items: array:9 [▼
    "9c436867-afe9-4234-a849-253aea4f602c" => "aaa"
    "d250102b-1370-40d0-99c5-7e5bfd0a15e4" => "sss"
    "7342f212-083b-458d-8af8-24986bbb627d" => "ddd"
    "029c53ce-dc16-49fd-8d83-9d8270d9ff37" => "fff"
    "3add6a37-72e2-4054-853e-9ed8addbf3ea" => "ggg"
    "28f5a9ac-014e-4f22-bda8-e2d5b1f48273" => "hhh"
    "94fccb2c-d732-4369-9bf7-78925797e578" => "jjj"
    "5b494994-93f0-406e-b420-aceb7b6111d7" => "kkk"
    "22a7824a-c6eb-45e7-b9c5-e40c134e3ac8" => "lll"
  ]
}

Perfect. This collection is later passed into Form::select to populate select / option dropdown.

I would like to prepend this collection with another key-value pair where key will be empty string and value will contain text like "Choose something".

I can append:

$foo[''] = 'Choose something…';

so I get

Collection {#506 ▼
  #items: array:10 [▼
    "9c436867-afe9-4234-a849-253aea4f602c" => "aaa"
    "d250102b-1370-40d0-99c5-7e5bfd0a15e4" => "sss"
    "7342f212-083b-458d-8af8-24986bbb627d" => "ddd"
    "029c53ce-dc16-49fd-8d83-9d8270d9ff37" => "fff"
    "3add6a37-72e2-4054-853e-9ed8addbf3ea" => "ggg"
    "28f5a9ac-014e-4f22-bda8-e2d5b1f48273" => "hhh"
    "94fccb2c-d732-4369-9bf7-78925797e578" => "jjj"
    "5b494994-93f0-406e-b420-aceb7b6111d7" => "kkk"
    "22a7824a-c6eb-45e7-b9c5-e40c134e3ac8" => "lll"
    "" => "Choose something…"
  ]
}

but no idea how I can move it as the first element of the collection. I simply cannot use array_merge because I'm dealing with instance of Illuminate\Database\Eloquent\Collection rather than array so this answer won't work.

Any hints? Thanks.

like image 976
Matt Komarnicki Avatar asked Nov 05 '15 03:11

Matt Komarnicki


People also ask

How do I use prepend in laravel?

The prepend method will add a a given $value to the beginning of the collection. You can also supply an optional $key that will be used as the key for the new $value when adding an item to the beginning of an associative array. The prepend method returns a reference to the original collection instance.

What is pull method in laravel?

Pull method pulls the item from array by its key.

What is first () in laravel?

The Laravel Eloquent first() method will help us to return the first record found from the database while the Laravel Eloquent firstOrFail() will abort if no record is found in your query. So if you need to abort the process if no record is found you need the firstOrFail() method on Laravel Eloquent.


2 Answers

$foo = ['' => 'Choose something…'] + $foo->all();

If your $foo must be a collection instance, simply wrap it in a collection again:

$foo = collect(['' => 'Choose something…'] + $foo->all());

I submitted a PR to laravel to allow you to pass a key to prepend. If you're using Laravel 5.1.24 or newer, you can now do this:

$foo = $this->fooRepository->all()
            ->lists('name', 'id')
            ->prepend('Choose something…', '');

Later versions of Laravel have renamed the lists method to pluck. If you're using relatively modern version of Laravel, use pluck instead:

$foo = $this->fooRepository->all()
            ->pluck('name', 'id')
            ->prepend('Choose something…', '');
like image 118
Joseph Silber Avatar answered Sep 23 '22 10:09

Joseph Silber


Try using ->prepend()

http://laravel.com/api/5.1/Illuminate/Database/Eloquent/Collection.html#method_prepend

$foo->prepend('Choose Something')


This won't give the correct result. The index would be 0 instead of an empty string. Instead you could try something like this

$foo = $foo->reverse()->put('Choose Something')->reverse()

But using @Joseph Silber answer is probably better.

like image 36
EspadaV8 Avatar answered Sep 24 '22 10:09

EspadaV8