Wenn ich in Laravel eine Abfrage durchführe:
$foods = Food::where(...)->get();
... dann $foods
ist eine Illuminate Collection von Food
Modellobjekten. (Im Wesentlichen eine Reihe von Modellen.)
Die Schlüssel dieses Arrays sind jedoch einfach:
[0, 1, 2, 3, ...]
... Wenn ich also beispielsweise das Food
Objekt mit einer id
von 24 ändern möchte , kann ich dies nicht tun:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
... weil dies lediglich das 25. Element im Array ändert, nicht das Element mit einem id
von 24.
Wie erhalte ich ein einzelnes (oder mehrere) Element (e) aus einer Sammlung nach JEDEM Attribut / jeder Spalte (z. B. ID / Farbe / Alter / usw.), ohne darauf beschränkt zu sein?
Natürlich kann ich das tun:
foreach ($foods as $food) {
if ($food->id == 24) {
$desired_object = $food;
break;
}
}
$desired_object->color = 'Green';
$desired_object->save();
... aber das ist nur eklig.
Und natürlich kann ich das tun:
$desired_object = Food::find(24);
$desired_object->color = 'Green';
$desired_object->save();
... aber das ist noch schlimmer , weil es eine zusätzliche unnötige Abfrage ausführt, wenn ich bereits das gewünschte Objekt in der $foods
Sammlung habe.
Vielen Dank im Voraus für jede Anleitung.
BEARBEITEN:
Um klar zu sein, können Sie eine Illuminate Collection aufrufen, ohne eine weitere Abfrage zu erzeugen->find()
, aber es wird nur eine primäre ID akzeptiert. Zum Beispiel:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
Es gibt jedoch immer noch keine saubere (nicht schleifenförmige, nicht abfragende) Möglichkeit, ein oder mehrere Elemente anhand eines Attributs aus einer Sammlung wie folgt zu erfassen:
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(