从 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 个元素(基本上是数组索引),而不是具有 id22 的用户。 不,它没有。 Check the source code for yourself. +1,不,它会得到id=22的模型,这是正确的答案。 各位,源代码中的$key 指的是items 数组中的数组键。看看this example collection - 正如您可以清楚地看到的那样,具有$key0 的模型具有id1。如果我从用户 id 44 开始,那么 $users->find(0) 将返回用户为 id44not 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 资源控制器中编辑、销毁和获取单个值?

laraver框架学习------工厂模型填充测试数据

如何从 laravel 的 eloquent 集合中获取外键

通过 Laravel 集合创建单个数组,但具有特定字段

如何在 laravel 中获取所有模型/迁移名称并添加单个新列

从资源文件夹中获取图像 - Laravel