php - Laravel:按属性从集合中获取对象

标签 php mysql laravel

在 Laravel 中,如果我执行查询:

$foods = Food::where(...)->get();

...然后 $foodsIlluminate 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/

相关文章:

php - 如何在 woocommerce 中以编程方式插入产品类型

php - 我尝试以这种方式将数据更新到数据库中,但对于第一个 if 语句 if ( !empty($_POST) ) 可能不起作用

php - 在隐藏的 div 中显示 PHP 中的 MySQL 数据

PHP 批量插入 foreach

php - 在 laravel/lumen 中创建临时表并插入数据

PHP:如何使用 XML 数据发送 REST 请求

mysql - 需要在 MySQL 中只选择包含反斜杠的数据

mysql - Asterisk 中的自定义CDR字段

未找到 Laravel 5.1 类 '\App\User',EloquentUserProvider.php 第 126 行中的 FatalErrorException

php - 将部分API数据存储到数据库