我有一个laravel集合对象。
我想在其中使用第n个模型。
如何访问它?
编辑:
我在laravel documentation中找不到合适的方法。我可以在foreach循环中迭代集合,并在找到第n个项目时中断:
foreach($collection as $key => $object)
{
if($key == $nth) {break;}
}
// $object is now the nth one
但这看起来很混乱。
更简洁的方法是执行上述循环一次,并创建一个包含集合中所有对象的简单数组。但这似乎是不必要的重复。
在laravel collection class documentation中,有一个fetch方法,但我认为这会从匹配主键的集合中获取一个对象,而不是集合中的第n个。
答案 0 :(得分:37)
看作Illuminate\Support\Collection
实现ArrayAccess
,您应该能够简单地使用方括号表示法,即
$collection[$nth]
这会在内部调用offsetGet
,您也可以使用
$collection->offsetGet($nth)
最后,您可以使用get
方法,该方法允许使用可选的默认值
$collection->get($nth)
// or
$collection->get($nth, 'some default value')
答案 1 :(得分:7)
@ Phil的答案并没有完全获得第n个元素,因为密钥可能是无序的。如果您从数据库查询中获得了一个雄辩的集合,那么它可以正常工作,但如果您的密钥不是连续的,那么您需要做一些不同的事情。
$collection = collect([0 => 'bish', 2 => 'bash']); $collection[1] // Undefined index
相反,我们可以做$collection->values()[1] // string(4) bash
使用array_values()
甚至可以制作一个宏来执行此操作:
Collection::macro('nthElement', function($offset, $default = null) {
return $this->values()->get($offset, $default);
}):
宏用法示例:
$collection = collect([0 => 'bish', 2 => 'bash']);
$collection->nthElement(1) // string(4) 'bash'
$collection->nthElement(3) // undefined index
$collection->nthElement(3, 'bosh') // string (4) bosh
答案 2 :(得分:0)
如果集合在保留排序后的索引方面遇到问题...您可以根据该集合的值创建一个新集合,然后尝试访问新索引的集合,就像您期望的那样:
例如获取价格第二高的商品
$items = collect(
[
"1" => ["name" => "baseball", "price" => 5],
"2" => ["name"=> "bat", "price" => 15],
"3" => ["name" => "glove", "price" => 10]
]
);
collect($items->sortByDesc("price")->values())[1]["name"];
// Result: glove
类似于变形的答案,但不相同。在排序之后简单地使用values()
并不会给您预期的结果,因为索引始终与每个项目保持耦合。
在Laravel Github上使用@howtomakeaturn以获得此解决方案: https://github.com/laravel/framework/issues/1335