如何将对象(模型类型对象)插入到Laravel中特定索引号的集合对象中


How to insert an object (Model type object) into Collection Object in Laravel at specific index number?

我读过戴尔·里斯(Dayle Rees(的《光明代码》(Code Bright(,以了解更多关于Laravel中使用的雄辩Collection的信息。也做了一些其他研究,但找不到我正在寻找的答案。

我想将一个对象(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。现在,我真正想做的是,我想在集合对象的索引号/位置[2]显式放置一个新Attendance Object,从而推动出席对象的其余部分。我真的很难做到这一点。我怎样才能做到这一点,使上面的集合对象看起来像下面这样:

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对象中。

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

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


您可以使用 add 方法将项添加到Eloquent'Collection对象;

$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;

此表格也适用于 雄辩版 Collection .

put 方法在集合中设置给定的键和值:

$collection = collect(['product_id' => 1, 'name' => 'Desk']);
$collection->put('price', 100);
$collection->all();
// ['product_id' => 1, 'name' => 'Desk', 'price' => 100]

假设您要在位置 4 处输入集合项

$position = 4;
$top = $collection->splice(0,$position);
$bottom = $collection->splice($position);
$top->push($newItem);
$collection = $top->concat($bottom);