从 Laravel 集合中获取单个模型
Posted
技术标签:
【中文标题】从 Laravel 集合中获取单个模型【英文标题】:Fetching Single Model from Laravel Collection 【发布时间】:2014-03-23 19:59:57 【问题描述】:假设您有一个 Illuminate Collection 的 User
模型对象。
$users = User::all();
现在,您想通过 ID 从该集合中获取单个用户。
我知道这样做的唯一方法(超级丑):
$user_id = 22;
$user = $users->filter(function($user) use ($user_id)
return $user->id = $user_id;
)->first();
(取自this question and answer。)
但是,如果您这样做,$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
或其他东西相同。似乎无法复制集合。
根据this Github issue,Collection::filter() 用于返回全新的对象实例。显然,它不再。我猜$temp_users = $users;
也没有 - 这真是令人困惑。
【问题讨论】:
【参考方案1】:集合形式的 Eloquent 响应实际上扩展了位于 Illuminate\Database\Eloquent\Collection
的特殊集合类型,它有一个熟悉的方法 find()
。只需使用它。
$users = User::all();
$jack = $users->find(22);
【讨论】:
谢谢 Cyode,但恐怕不行。这将简单地返回集合中的第 23 个元素(基本上是数组索引),而不是具有id
的 22
的用户。
不,它没有。 Check the source code for yourself.
+1,不,它会得到id=22
的模型,这是正确的答案。
各位,源代码中的$key
指的是items
数组中的数组键。看看this example collection - 正如您可以清楚地看到的那样,具有$key
的0
的模型具有id
的1
。如果我从用户 id 44 开始,那么 $users->find(0)
将返回用户为 id
的 44
,not 0
。
那么您的代码还有其他问题。 find()
是正确答案,非常适合我,$key
在搜索时与模型的 主键 有一切。祝你好运。【参考方案2】:
如果 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
);
【讨论】:
以上是关于从 Laravel 集合中获取单个模型的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模型类在 laravel 8 资源控制器中编辑、销毁和获取单个值?
如何从 laravel 的 eloquent 集合中获取外键