从Laravel Collection中获取单个模型

时间:2014-02-22 03:08:13

标签: php laravel illuminate-container

假设您有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个身份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;也没有 - 这让人感到困惑。

2 个答案:

答案 0 :(得分:4)

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

$users = User::all();

$jack = $users->find(22);

答案 1 :(得分: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
});