在 Laravel 中,如果我执行查询:
$foods = Food::where(...)->get();
...然后 $foods
是 Illuminate Collection Food
模型对象。 (本质上是一个模型数组。)
但是,这个数组的键很简单:
[0, 1, 2, 3, ...]
...所以如果我想更改 id
为 24 的 Food
对象,我不能这样做:
$desired_object = $foods->get(24);
$desired_object->color = 'Green';
$desired_object->save();
...因为这只会改变数组中的第 25 个元素,而不是 id
为 24 的元素。
如何按任意属性/列(例如但不限于 id/color/age/等)从集合中获取单个(或多个)元素?
当然,我可以这样做:
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
集合中已经有所需的对象时,它会执行额外的不必要的查询。
提前感谢您的任何指导。
编辑:
明确地说,您可以在 Illuminate Collection 上调用 ->find()
而不会产生另一个查询,但它仅接受主标识。例如:
$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. :(
最佳答案
您可以使用 filter
,就像这样:
$desired_object = $food->filter(function($item) {
return $item->id == 24;
})->first();
filter
也会返回一个 Collection
,但既然你知道只有一个,你可以在那个 上调用
.first
收藏
您不再需要过滤器(或者也许永远,我不知道这已经快 4 岁了)。您可以使用 first
:
$desired_object = $food->first(function($item) {
return $item->id == 24;
});
关于php - Laravel:按属性从集合中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931020/