【问题标题】:Fetching Single Model from Laravel Collection从 Laravel 集合中获取单个模型
【发布时间】:2014-03-23 19:59:57
【问题描述】:

假设您有一个 Illuminate CollectionUser 模型对象。

$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; 也没有 - 这真是令人困惑。

【问题讨论】:

    标签: php laravel illuminate-container


    【解决方案1】:

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

    $users = User::all();
    
    $jack = $users->find(22);
    

    【讨论】:

    • 谢谢 Cyode,但恐怕不行。这将简单地返回集合中的第 23 个元素(基本上是数组索引),而不是具有 id22 的用户。
    • +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
    });
    

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 2011-07-19
      • 2019-01-28
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多