属性によってコレクションからオブジェクトを取得する 質問する

属性によってコレクションからオブジェクトを取得する 質問する

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 番目の要素のみを変更するものであり、 がid24 の要素は変更しないためです。

任意の属性/列 (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;
});

おすすめ記事