最佳答案
在 Laravel,如果我执行一个查询:
$foods = Food::where(...)->get();
那么 $foods
就是 Food
模型对象的 照明系列(本质上是一个模型数组)
但是,这个数组的键很简单:
[0, 1, 2, 3, ...]
... 所以如果我想改变,比如说,Food
对象的 id
是24,我不能这样做:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
因为这只会改变数组中的第25个元素而不是 id
为24的元素。
How do I get a single (or multiple) element(s) from a collection by ANY attribute/column (such as, but not limited to, 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();
... 但那是 even more gross,因为当我已经在 $foods
集合中有所需的对象时,它会执行一个额外的不必要的查询。
提前谢谢你的指导。
编辑:
需要说明的是,can在 IlluminateCollection 上调用 ->find()
而不产生另一个查询,但是 只有接受一个主 ID。例如:
$foods = Food::all();
$desired_food = $foods->find(21); // Grab the food with an ID of 21
但是,仍然没有一种干净(非循环、非查询)的方法从 Collection 中通过属性获取元素,如下所示:
$foods = Food::all();
$green_foods = $foods->where('color', 'green'); // This won't work. :(