问题 如何在Laravel中的特定索引号处将对象(模型类型对象)插入到Collection对象中?


我读过Dayle Rees的 代码明亮 了解更多有关Eloquent的信息 Collection用于Laravel。做了一些其他的研究,但找不到我想要的答案。

我想插入一个对象(Model 类型对象)成一个 Collection 对象在特定位置。

例如:

这是返回的集合

Illuminate\Database\Eloquent\Collection Object
(
    [0] => Attendance Object
        ([present_day] => 1)

    [1] => Attendance Object
        ([present_day] => 2)

    [2] => Attendance Object
        ([present_day] => 4) 

    [3] => Attendance Object
        ([present_day] => 5) 

)

如上所示 [present_day] 有一个值范围从 1 to 5,但价值, 3 在序列中缺失。现在,我真正想做的是,我想明确地提出一个新的 Attendance Object 在Collection Object的位置 [2] 索引号/位置,因此通过推送出席对象的其余部分。我真的很难做到这一点。我怎么能这样做使上面的集合对象看起来像下面的东西:

Illuminate\Database\Eloquent\Collection Object
(
    [0] => Attendance Object
        ([present_day] => 1)

    [1] => Attendance Object
        ([present_day] => 2)

    [2] => Attendance Object    // This is where new object was added.
        ([present_day] => 3) 

    [4] => Attendance Object
        ([present_day] => 4) 

    [5] => Attendance Object
        ([present_day] => 5) 

)

我认为如果是数组,有一些方法可以完全像这样做。因为这是一个 Collection,我不知道该怎么做。

注意: 我不想将它转换为数组并在数组中插入。出于某种原因,我希望严格遵守此输出 Collection 目的。


2817
2017-12-10 09:14


起源

集合对象有一个add方法,使用它然后像这样重新排序集合; $collection->sortBy(function($model){ return $model->present_day; }); 然后,这会将集合重新排序为您想要的。 - Matt Burrow
我还没试过这个解决方案。只需阅读你的评论,我相信它应该有效。实际上,这是一个很好的解决我的问题的方法。 - Nirmalz Thapaz
@MattBurrow我做到了。它完美地工作!! - Nirmalz Thapaz
我添加作为答案。 - Matt Burrow


答案:


要将项目插入集合,请参阅此答案; 回答

基本上,拆分集合,在相关索引处添加项目。


您可以将项目添加到 Eloquent\Collection 对象 add 方法;

$collection->add($item);  // Laravel 4

要么

$collection->push($item); // Laravel 5 

然后你可以使用。重新排序集合 sortBy 方法;

$collection = $collection->sortBy(function($model){ return $model->present_day; });

这将重新排序您的收藏 present_day 属性。


请注意,上述代码仅在您使用时才有效 Illuminate\Database\Eloquent\Collection。如果你使用平原 Eloquent\Support\Collection,没有 add 方法。

相反,您可以使用空数组偏移量,与在普通数组中插入新元素相同:

$collection[] = $item;

此表单也适用于Eloquent版本 Collection


11
2017-12-10 11:30



对于每个来到这里并且想知道这不再起作用的人[L5和更高],请试试 $collection->push($item);。它在集合末端追加一个项目 - manniL
当没有提到“索引”时,我不确定为什么这是接受的答案 - Andrew
重要的是要提到我们也有 $collection->prepend() 和 $collection->merge(),有时它们也很有用,因为它只是 collect() 创造一个新的 Collection。 - giovannipds