如何在Laravel Eloquent集合数组中添加键值对?

15

我正在从数据库中提取一些东西:

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

完美。稍后将此集合传递到 Form::select 中以填充选择/选项下拉列表。

我想在这个集合前面添加另一个键值对,其中键为空字符串,而值包含类似 "选择一些东西" 的文本。

我可以附加:

$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实例而不是数组,所以这个答案不适用。

有什么提示吗?谢谢。

2个回答

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

如果你的$foo必须是一个集合实例,只需再次将其包装在一个集合中:

$foo = collect(['' => 'Choose something…'] + $foo->all());
我向laravel提交了一个PR,允许你将键传递给“prepend”。如果你正在使用Laravel 5.1.24或更高版本,现在可以这样做:

我提交了一个拉取请求到 Laravel ,以便允许您向 prepend 传递一个键。如果您正在使用 Laravel 5.1.24 或更新版本,则现在可以执行以下操作:

$foo = $this->fooRepository->all()
            ->lists('name', 'id')
            ->prepend('Choose something…', '');
稍后的 Laravel 版本已将 lists 方法重命名为 pluck。如果您使用的是相对较新的 Laravel 版本,请改用 pluck
如果你正在使用较新版本的 Laravel,请使用 pluck 方法代替 lists 方法。
$foo = $this->fooRepository->all()
            ->pluck('name', 'id')
            ->prepend('Choose something…', '');

谢谢Joseph。这非常有帮助。我唯一需要更改的是使用 Illuminate\Support\Collection - Matt Komarnicki
@slick - 你是什么意思?你在哪里、做了什么以及为什么要改变? - Joseph Silber
稍后,在期望 $foo 集合的位置内。 :) 一切都好。别担心! - Matt Komarnicki
1
现在值得一提的是,lists已经被弃用,应该使用pluck代替。 - Matt Komarnicki
->prepend('选择一些东西...', ''); 的效果非常棒! - Rox

2

2
这将把键设置为0。OP希望键是一个空字符串。 - Joseph Silber
1
是的,你说得完全正确。可以像这样做:$foo->reverse()->put(‘选择一些东西’)->reverse() - EspadaV8
谢谢,数组中是否有类似于“array_unshift()”更好的方法? - Solivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接