当前位置: 首页 > 知识库问答 >
问题:

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

轩辕啸
2023-03-14

在Laravel中,如果执行查询:

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

...然后,$foodsFood模型对象的集合。(基本上是一系列模型。)

但是,此数组的键仅为:

[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/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集合中已经有了所需的对象时,它会执行额外的不必要的查询。

提前感谢您的指导。

编辑:

为了清楚起见,您可以调用-

$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.  :(

共有3个答案

郎建章
2023-03-14

从Laravel5.5开始,您可以使用firstWhere()

就你而言:

$green_foods = $foods->firstWhere('color', 'green');
养俊驰
2023-03-14

Laravel提供了一个名为keyBy的方法,该方法允许在模型中根据给定的键设置键。

$collection=$collection-

将返回集合,但键是来自任何模型的id属性的值。

然后你可以说:

$desired\u food=$foods-

而且它将抓取正确的项目,而不需要使用过滤功能。

祁烨
2023-03-14

您可以使用过滤器,如下所示:

$desired_object = $food->filter(function($item) {
    return $item->id == 24;
})->first();

过滤器也将返回一个集合,但由于您知道只有一个集合,因此可以首先调用该集合

你再也不需要过滤器了(也许永远都不需要,我不知道这已经快4年了)。您可以先使用

$desired_object = $food->first(function($item) {
    return $item->id == 24;
});
 类似资料:
  • 我一直在查看Laravel系列的文档和API,但似乎没有找到我想要的: 我想从集合中检索具有模型数据的数组,但只获取指定的属性。 例如,类似于,其中集合实际上包含用户的所有属性,因为它们在其他地方使用,但在这个特定位置,我需要一个包含userdata的数组,并且只包含指定的属性。 在拉雷维尔,似乎没有一个帮手来帮你我怎样才能用最简单的方法做到这一点?

  • 我想从最终结果中删除一些属性,并在这里找到了这个从Laravel集合中仅获取特定属性 这适用于顶层,但需要从相关项目中删除一些属性,例如用户有一个访问卡,并且访问卡的属性中有一些长文本详细信息。 我想从最终结果中删除该属性。使用链接中提到的方法是否可行?

  • 我有一个包含如下值的对象 这些都在变量autossuggest中。现在我只想获得值 谢谢你的小费

  • 简单的代码不起作用!我一直在用if语句获取行上非object的属性时出错。我尝试像数组一样访问它,但收到一条消息说它不能以数组的形式访问stdClass。 $group的print\u r、var\u dump和dd可以给出: 使用$setting=$group\u可以- 返回错误不能使用stdClass类型的对象作为数组 laravel错误的详细信息如下: 可处理的例外情况- 编辑我删除了第一部

  • 问题内容: 我正在为Magento(1.6)商店开发类别汇总报告。 为此,我想获得一部分产品的“订单项”集合-这些产品的唯一类别ID(这是我创建的Magento产品属性)与特定值匹配。 我可以通过基于目录/产品的集合来获得相关的结果集。 Magento不喜欢它,因为有相同商品ID的重复条目。 如何根据订单项构建代码以获取此结果集?加入按属性过滤的产品集合使我难以理解。这段代码并不能解决问题,因为它

  • 我正在用Laravel 5.2开发一个Web应用程序,但有一个问题我无法解决。 我有一个扩展了雄辩模型的模型,但当我试图输出带有“where”的数据库表时,例如 它返回一个包含许多信息的集合,这些信息此时对我来说无用,比如“守卫”、“键入”...我的表的数据在“属性”下。遵循laravel的指南,我看到每个人都像我一样简单地使用它,然后用