2

假设您有一个IlluminateUser模型对象集合。

$users = User::all();

现在,您想按 ID 从该集合中获取单个用户。

我知道这样做的唯一方法(超级丑陋):

$user_id = 22;
$user = $users->filter(function($user) use ($user_id) {
    return $user->id = $user_id;
})->first();

(取自这个问题和答案。)

但是,如果您这样做,该$users集合将被破坏且无法使用。例如,如果之前集合中有 100 个唯一用户,那么您现在将拥有 100 个具有 id 的用户副本,22出于某种上帝遗弃的原因。

如何在不破坏集合或循环遍历集合的情况下从集合中按 ID 获取单个用户?

我以为这会奏效...

$user_id = 22;
$temp_users = $users;
$user = $temp_users->filter(function($user) use ($user_id) {
    return $user->id = $user_id;
})->first();

但是,更令人气愤的$users是,仍然被过滤器调用破坏了——所以显然$temp_users = $users是相同的$temp_users = &$users或什么的。似乎没有办法复制一个集合。

根据这个 Github issue, Collection::filter() 用于返回全新的对象实例。显然,它不再。我也没有$temp_users = $users;猜到——这真是令人困惑。

4

2 回答 2

4

集合形式的 Eloquent 响应实际上扩展了一个位于 at 的特殊集合类型Illuminate\Database\Eloquent\Collection,它有一个熟悉的方法find()。只需使用它。

$users = User::all();

$jack = $users->find(22);
于 2014-02-22T03:10:37.377 回答
0

如果 ID 不是您的主键,您可以像这样使用 firstWhere():

$user_id = 22;
$userYouNeed = $users->firstWhere('id', $user_id);

如果您有更复杂的条件,您可以考虑使用 first() 并为您自己的回调提供这样的条件

$user_id = 22;
$userYouNeed = $users->firs(function ($user) use ($user_id) {
    return $user->id === $user_id; // Or a more complex condition
});
于 2020-06-23T21:17:17.057 回答