假设您有Illuminate Collection个User
模型对象。
$users = User::all();
现在,您希望通过ID从该集合中获取单个用户。
我知道这样做的唯一方式(超级丑陋):
$user_id = 22;
$user = $users->filter(function($user) use ($user_id) {
return $user->id = $user_id;
})->first();
但是,如果执行此操作,$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;
也没有 - 这让人感到困惑。
答案 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
});