2015-11-05 4 views
4

Я что-то выборка из базы данных:Как добавить массив Laravel Eloquent Collection с парой ключ-значение?

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

я получаю:

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. Позднее эта коллекция будет передана в Form::select, чтобы заполнить выпадающее меню select/option.

Я хотел бы добавить эту коллекцию к другой паре ключ-значение, где ключ будет пустой строкой, а значение будет содержать текст типа «Выберите что-нибудь».

Я могу добавить:

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

так что я получаю

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

но не знаю как я могу переместить его в качестве первого элемента коллекции. Я просто не могу использовать array_merge, потому что я имею дело с экземпляром Illuminate\Database\Eloquent\Collection, а не с массивом, поэтому this answer не будет работать.

Любые подсказки? Благодарю.

ответ

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

Если $foo должен быть экземпляр коллекции, просто обернуть его в коллекции еще раз:

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

I submitted a PR to laravel, чтобы позволить вам пройти ключ к prepend. Если вы используете Laravel 5.1.24 или новее, вы можете теперь сделать это:

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

Спасибо Джозефу. Это было очень полезно. Единственное, что я должен был изменить, это использовать «Illuminate \ Support \ Collection». – slick

+0

@slick - что вы имеете в виду? Где, что и почему вы должны были изменить? –

+0

позже, в том месте, которое ожидало эту коллекцию '$ foo'. :) Все хорошо. Не волнуйся! – slick

1

Попробуйте использовать ->prepend()

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

$foo->prepend('Choose Something') 


Это не даст правильный результат. Индекс будет 0 вместо пустой строки. Вместо этого вы можете попробовать что-то вроде этого

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

Но использование ответа @Joseph Silber, вероятно, лучше.

+2

Это установит ключ на '0'. OP хочет, чтобы ключ был пустой строкой. –

+1

Да, вы абсолютно правы. Может сделать что-то вроде '$ foo-> reverse() -> put ('Select Something') -> reverse()' вместо – EspadaV8

Смежные вопросы