En Laravel, si realizo una consulta:
$foods = Food::where(...)->get();
... entonces $foods
es una colección Illuminate de Food
objetos modelo. (Esencialmente una variedad de modelos).
Sin embargo, las claves de esta matriz son simplemente:
[0, 1, 2, 3, ...]
... así que si quiero alterar, digamos, el Food
objeto con un id
24, no puedo hacer esto:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
... porque esto simplemente alterará el elemento 25 de la matriz, no el elemento con un valor id
de 24.
¿Cómo obtengo un elemento (s) único (o múltiple) de una colección por CUALQUIER atributo / columna (como, entre otros, id / color / age / etc.)?
Por supuesto, puedo hacer esto:
foreach ($foods as $food) {
if ($food->id == 24) {
$desired_object = $food;
break;
}
}
$desired_object->color = 'Green';
$desired_object->save();
... pero eso es asqueroso.
Y, por supuesto, puedo hacer esto:
$desired_object = Food::find(24);
$desired_object->color = 'Green';
$desired_object->save();
... pero eso es aún más asqueroso , porque realiza una consulta adicional innecesaria cuando ya tengo el objeto deseado en la $foods
colección.
Gracias de antemano por cualquier orientación.
EDITAR:
Para ser claros, puede llamar ->find()
a una Colección Illuminate sin generar otra consulta, pero solo acepta una ID principal. Por ejemplo:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
Sin embargo, todavía no hay una forma limpia (sin bucles, sin consultas) de tomar un elemento (s) por un atributo de una colección, como este:
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(