No Laravel, se eu fizer uma consulta:
$foods = Food::where(...)->get();
... então $foodsé uma coleção Illuminate de Foodobjetos modelo. (Essencialmente, uma variedade de modelos.)
No entanto, as chaves desta matriz são simplesmente:
[0, 1, 2, 3, ...]
... então, se eu quiser alterar, digamos, o Foodobjeto com um idde 24, não posso fazer isso:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
... porque isso apenas alterará o 25º elemento na matriz, não o elemento com um idde 24.
Como obtenho um único (ou vários) elemento (s) de uma coleção por QUALQUER atributo / coluna (como, mas não se limitando a id / cor / idade / etc.)?
Claro, eu posso fazer isso:
foreach ($foods as $food) {
if ($food->id == 24) {
$desired_object = $food;
break;
}
}
$desired_object->color = 'Green';
$desired_object->save();
... mas, isso é simplesmente nojento.
E, claro, posso fazer isso:
$desired_object = Food::find(24);
$desired_object->color = 'Green';
$desired_object->save();
... mas isso é ainda mais grosseiro , porque realiza uma consulta adicional desnecessária quando já tenho o objeto desejado na $foodscoleção.
Desde já, agradeço qualquer indicação.
EDITAR:
Para ser claro, você pode chamar ->find()uma coleção Illuminate sem gerar outra consulta, mas ela só aceita uma ID primária. Por exemplo:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
No entanto, ainda não há uma maneira limpa (sem loop, sem consulta) de pegar um (s) elemento (s) por um atributo de uma coleção, como este:
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(