返回

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

php

在 Laravel 中通过属性从集合中获取对象

前言

在 Laravel 中,你可以使用 Collection 对象来存储 Eloquent 模型实例的集合。然而,有时你需要通过某些属性从集合中获取一个或多个特定的元素。本文将探讨在 Laravel 中如何通过属性(例如 idcolor 等)高效地从集合中获取对象。

问题陈述

假设你有一个 Food 模型对象的集合 $foods,并且你想更改 id 为 24 的特定对象的 color 属性。如果你直接使用 $foods->get(24) 来获取该对象,它只会返回集合中的第 25 个元素,而不是 id 为 24 的元素。

使用循环或额外的数据库查询来查找特定对象既低效又繁琐。因此,我们需要一种更直接、更优雅的方法来通过属性从集合中获取对象。

解决方法

1. 使用 keyBy() 方法

keyBy() 方法允许你将集合中的每个元素转换为一个键值对数组,其中键是指定属性的值,值是该元素本身。使用此方法,你可以通过属性轻松地获取元素。

$keyedFoods = $foods->keyBy('id');
$desiredFood = $keyedFoods[24];

现在,$desiredFood 将包含具有 id 为 24 的 Food 对象。

2. 使用 pluck()where() 方法

另一种方法是使用 pluck()where() 方法。pluck() 方法从集合中提取特定属性的值并返回一个数组,而 where() 方法可用于根据条件过滤数组。

$foodIds = $foods->pluck('id');
$desiredFoodId = $foodIds->where('id', 24)->first();
$desiredFood = $foods->find($desiredFoodId);

这种方法首先获取集合中所有对象的 id 的数组。然后,使用 where() 方法查找 id 为 24 的数组元素。最后,使用 find() 方法从集合中获取具有该 id 的对象。

3. 使用 firstWhere() 方法

Laravel 8 中引入了 firstWhere() 方法,它提供了一种简洁的方式来通过属性从集合中获取第一个元素。

$desiredFood = $foods->firstWhere('id', 24);

结论

通过属性从 Laravel 集合中获取对象有多种方法。keyBy() 方法提供了一种通过键值对查找的有效方式,而 pluck()where() 方法提供了一种灵活且可扩展的方式。firstWhere() 方法提供了 Laravel 8 中最简洁、最直接的方法。根据你的特定用例,选择最适合你的方法。

常见问题解答

  1. 可以通过多个属性获取对象吗?

    • 是的,你可以使用 whereIn()whereBetween() 等方法。
  2. 如何从集合中获取多个对象?

    • 使用 filter()where() 方法过滤集合,然后使用 values()pluck() 方法获取结果。
  3. 这些方法是否适用于其他类型的集合?

    • 是的,这些方法适用于任何类型的 Illuminate Collection,不仅限于 Eloquent 模型。
  4. 我应该使用哪种方法?

    • 如果键通常是唯一的,则 keyBy() 方法是最好的选择。对于更复杂的过滤,pluck()where()firstWhere() 方法提供了更多的灵活性。
  5. 这些方法是否会对性能产生影响?

    • 对于小型集合,影响可以忽略不计。对于大型集合,keyBy() 方法通常比其他方法效率更高。