В Laravel, если я выполняю запрос:
$foods = Food::where(...)->get();
... then $foods
представляет собой Illuminate Collection объектов модели Food
. (По сути, это массив моделей.)
Однако ключи этого массива просто:
[0, 1, 2, 3, ...]
... поэтому, если я хочу изменить, скажем, объект Food
с id
из 24, я не могу этого сделать:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
... потому что это просто изменит 25-й элемент в массиве, а не элемент с id
из 24.
Как получить один (или несколько) элемент из коллекции по ANY атрибуту/столбцу (например, id/color/age/etc.)?
Конечно, я могу это сделать:
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
.
Заранее благодарим за любые рекомендации.
EDIT:
Чтобы быть понятным, вы можете вызвать ->find()
в коллекции Illuminate, не создавая другого запроса, но он принимает только первичный идентификатор. Например:
$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. :(