【发布时间】:2014-01-22 17:43:30
【问题描述】:
在 Laravel 中,如果我执行查询:
$foods = Food::where(...)->get();
...那么$foods 是Illuminate Collection 的Food 模型对象。 (本质上是一个模型数组。)
但是,这个数组的键很简单:
[0, 1, 2, 3, ...]
...所以如果我想用 24 的 id 更改 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() 而不会产生另一个查询,但它仅接受主 ID。例如:
$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. :(
【问题讨论】: