2

モデル オブジェクトのIlluminate Collectionがあるとします。User

$users = User::all();

ここで、ID によってそのコレクションから 1 人のユーザーを取得したいと考えています。

私がこれを行うことを知っていた唯一の方法(超醜い):

$user_id = 22;
$user = $users->filter(function($user) use ($user_id) {
    return $user->id = $user_id;
})->first();

この質問と回答から取得。)

ただし、これを行うと、$usersコレクションが破棄されて使用できなくなります。たとえば、以前にコレクションに 100 人のユニーク ユーザーがいた場合、22神に見捨てられたという理由で id を持つユーザーのコピーが 100 になることになります。

コレクションを破棄したりループしたりせずに、コレクションから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コレクションを複製する方法はないようです。

この Github issueによると、 Collection::filter() は新しいオブジェクト インスタンスを返していました。明らかに、それはもうありません。そして、私も推測しませ$temp_users = $users;ん-それは地獄のように混乱しています.

4

2 に答える 2

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
});
于 2020-06-23T21:17:17.057 に答える