Laravel でクエリを実行すると、次のようになります。
$foods = Food::where(...)->get();
...そして$foods
、イルミネートコレクションモデルFood
オブジェクト (基本的にはモデルの配列)
ただし、この配列のキーは次のようになります。
[0, 1, 2, 3, ...]
...つまり、たとえば24 のFood
オブジェクトを変更したい場合id
、次のようにすることはできません。
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
...これは、配列内の 25 番目の要素のみを変更するものであり、 がid
24 の要素は変更しないためです。
任意の属性/列 (ID、色、年齢など、ただしこれらに限定されない) によってコレクションから単一 (または複数) の要素を取得するにはどうすればよいですか?
もちろん、これは可能です:
foreach ($foods as $food) {
if ($food->id == 24) {
$desired_object = $food;
break;
}
}
$desired_object->color = 'Green';
$desired_object->save();
...でも、それは気持ち悪いです。
そして、もちろん、次のこともできます:
$desired_object = Food::find(24);
$desired_object->color = 'Green';
$desired_object->save();
...でもそれはさらにひどいコレクション内に目的のオブジェクトがすでに存在する場合、不要な追加のクエリが実行されるためです$foods
。
編集:
はっきり言って、あなたはできる->find()
別のクエリを生成せずにIlluminate Collectionを呼び出すが、のみプライマリ ID を受け入れます。例:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
ただし、次のように、コレクションから属性によって要素を取得するクリーンな (ループなし、クエリなし) 方法はまだありません。
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(
ベストアンサー1
使用できますfilter
、 そのようです:
$desired_object = $food->filter(function($item) {
return $item->id == 24;
})->first();
filter
も を返しますCollection
が、 は 1 つしかないことがわかっているので、first
その を呼び出すことができますCollection
。
もうフィルターは必要ありません(または、もう必要ないかもしれません。これは4年近く前のものなのでわかりません)。first
:
$desired_object = $food->first(function($item) {
return $item->id == 24;
});