简体   繁体   English

如何在Laravel Eloquent Collection数组前添加键值对?

[英]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. 此集合随后传递到Form::select以填充选择/选项下拉列表。

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. 我根本无法使用array_merge因为我正在处理Illuminate\\Database\\Eloquent\\Collection而不是array的实例,因此此答案将不起作用。

Any hints? 有什么提示吗? Thanks. 谢谢。

$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 . 我向laravel提交了PR,以便您可以传递密钥作为prepend If you're using Laravel 5.1.24 or newer, you can now do this: 如果您使用的是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 . Laravel的后续版本已经改名lists的方法来pluck If you're using relatively modern version of Laravel, use pluck instead: 如果您使用Laravel的比较现代版,用pluck来代替:

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

Try using ->prepend() 尝试使用 ->prepend()

http://laravel.com/api/5.1/Illuminate/Database/Eloquent/Collection.html#method_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. 索引将为0而不是空字符串。 Instead you could try something like this 相反,您可以尝试这样的事情

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

But using @Joseph Silber answer is probably better. 但是使用@Joseph Silber答案可能更好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM