W Laravel, jeśli wykonam zapytanie:
$foods = Food::where(...)->get();
... wtedy $foods
jest Illuminate Collection of Food
modelowych obiektów. (Zasadniczo szereg modeli.)
Jednak klucze tej tablicy to po prostu:
[0, 1, 2, 3, ...]
... więc jeśli chcę zmienić, powiedzmy, Food
obiekt z id
wartością 24, nie mogę tego zrobić:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
... ponieważ to tylko zmieni 25-ty element tablicy, a nie element z id
wartością 24.
Jak uzyskać pojedynczy (lub wiele) element (y) z kolekcji według DOWOLNEGO atrybutu / kolumny (takiego jak, ale nie wyłącznie, identyfikator / kolor / wiek / itp.)?
Oczywiście mogę to zrobić:
foreach ($foods as $food) {
if ($food->id == 24) {
$desired_object = $food;
break;
}
}
$desired_object->color = 'Green';
$desired_object->save();
... ale to po prostu obrzydliwe.
I oczywiście mogę to zrobić:
$desired_object = Food::find(24);
$desired_object->color = 'Green';
$desired_object->save();
... ale to jeszcze bardziej obrzydliwe , ponieważ wykonuje dodatkowe niepotrzebne zapytanie, gdy mam już żądany obiekt w $foods
kolekcji.
Z góry dziękuję za wszelkie wskazówki.
EDYTOWAĆ:
Żeby było jasne, to może zadzwonić ->find()
na Kolekcji Illuminate bez tarła kolejne zapytanie, ale tylko akceptuje podstawowy identyfikator. Na przykład:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
Jednak nadal nie ma czystego (nie zapętlającego się i nie wykonującego zapytań) sposobu na pobranie elementu (ów) przez atrybut z kolekcji, na przykład:
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(