laravelコレクションオブジェクトがあります。
その中でn番目のモデルを使用したいと思います。
どうすればアクセスできますか?
編集:
laravelのドキュメント で適切なメソッドが見つかりません。 foreachループでコレクションを繰り返し、n番目のアイテムが見つかったときにブレークすることができます。
foreach($collection as $key => $object)
{
if($key == $nth) {break;}
}
// $object is now the nth one
しかし、これは厄介なようです。
よりクリーンな方法は、上記のループを1回実行し、コレクション内のすべてのオブジェクトを含む単純な配列を作成することです。しかし、これは不必要な重複のようです。
laravelコレクションクラスのドキュメント にはフェッチメソッドがありますが、コレクションのn番目ではなく、主キーに一致するコレクションからオブジェクトをフェッチすると思います。
Illuminate\Support\Collection
はArrayAccess
を実装しているので、角括弧表記を簡単に使用できるはずです。
$collection[$nth]
これは内部でoffsetGet
を呼び出し、これも使用できます
$collection->offsetGet($nth)
そして最後に、オプションのデフォルト値を許可するget
メソッドを使用できます
$collection->get($nth)
// or
$collection->get($nth, 'some default value')
@Philの回答では、キーが順序付けされていない可能性があるため、n番目の要素を取得できません。 dbクエリから雄弁なコレクションを取得している場合は正常に機能しますが、キーが連続していない場合は、別の方法を実行する必要があります。
$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番目に高い価格のアイテムを入手する
_$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: https://github.com/laravel/framework/issues/1335 のこのソリューションの@howtomakeaturnへの謝辞