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.
完善。此集合稍后将传递到Form :: select以填充select / option下拉列表。
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…';
$ foo [''] ='选择一些东西......';
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.
但不知道如何将它作为集合的第一个元素。我根本无法使用array_merge,因为我正在处理Illuminate \ Database \ Eloquent \ Collection的实例而不是数组,所以这个答案是行不通的。
Any hints? Thanks.
任何提示?谢谢。
2 个解决方案
#1
17
$foo = ['' => 'Choose something…'] + $foo->all();
If your $foo
must be a collection instance, simply wrap it in a collection again:
如果你的$ foo必须是一个集合实例,只需将它再次包装在一个集合中:
$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:
我向laravel提交了一份PR,允许您将密钥传递给前置。如果您使用的是Laravel 5.1.24或更高版本,现在可以执行以下操作:
$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:
Laravel的更高版本已经重命名了要使用的列表方法。如果您使用的是相对现代版的Laravel,请使用pluck:
$foo = $this->fooRepository->all()
->pluck('name', 'id')
->prepend('Choose something…', '');
#2
1
Try using
->prepend()
尝试使用 - > 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
这不会给出正确的结果。索引将为0而不是空字符串。相反,你可以尝试这样的事情
$foo = $foo->reverse()->put('Choose Something')->reverse()
But using @Joseph Silber answer is probably better.
但使用@Joseph Silber答案可能更好。
#1
17
$foo = ['' => 'Choose something…'] + $foo->all();
If your $foo
must be a collection instance, simply wrap it in a collection again:
如果你的$ foo必须是一个集合实例,只需将它再次包装在一个集合中:
$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:
我向laravel提交了一份PR,允许您将密钥传递给前置。如果您使用的是Laravel 5.1.24或更高版本,现在可以执行以下操作:
$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:
Laravel的更高版本已经重命名了要使用的列表方法。如果您使用的是相对现代版的Laravel,请使用pluck:
$foo = $this->fooRepository->all()
->pluck('name', 'id')
->prepend('Choose something…', '');
#2
1
Try using
->prepend()
尝试使用 - > 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
这不会给出正确的结果。索引将为0而不是空字符串。相反,你可以尝试这样的事情
$foo = $foo->reverse()->put('Choose Something')->reverse()
But using @Joseph Silber answer is probably better.
但使用@Joseph Silber答案可能更好。