Что касается производительности, я не думаю, что будут какие-либо изменения, так как будет выполнен один и тот же запрос, а также будет выполнено одинаковое количество операций, например, цикл foreach()
это O(n)
в обоих случаях,так что в чем будет разница, но вы можете изменить код на что-то вроде ниже или использовать также троичный оператор.Разница будет в организации кодов.В контроллере тестирование будет проще.
Примечание: Но как id
будет и $user1
, и $user2
, поэтому давайте сделаем это ИЛИ вместо И
foreach($users as $user)
{
if( $user->id == $user_id_1 )
{
$user1_ok = true;
}elseif( $user->id == $user_id_2)
{
$user2_ok = true;
}
$check_users = [
$user1_ok,
$user2_ok
];
}
на
foreach($users as $user)
{
if( in_array($user->id, [$user_id_1, $user_id_2])
{
$user1_ok = true;
}
$check_users = [
$user1_ok,
$user2_ok
];
}
или
foreach($users as $user)
{
if( $user->id == $user_id_1 )
{
$check_users['user1_ok'] = $user->id == $user_id_1 ? true : false;
}
if( $user->id == $user_id_2)
{
$check_users['user2_ok'] = true;
}
}
Если вы хотите получить двигатели с user1_ok
, user2_ok
, вы можете запустить запрос, как предложил @Namoshek.
или вы можете изменить запрос на что-то вроде
League::query()->where('id', $league)
->whereHas('users', function($query) use ($user1, $user2) {
$query->where('id', $user1)->where('id', $user2);
})->exists();
, но как id будет и $ user1, и $ user2? Так, если это ИЛИ вместо AND.
League::query()->where('id', $league)
->whereHas('users', function($query) use ($user1, $user2) {
$query->whereIn('id', [$user1, $user2]);
})->exists();
или даже $users = [$user1, $user2];
и
League::query()->where('id', $league)
->whereHas('users', function($query) use ($users) {
$query->whereIn('id', $users);
})->exists();
Кстати, если вы хотите использовать этот запрос, вы можете просто вставить его в модель Engine и пользователя или использовать его при необходимости.Также для помощника, он может быть повторно использован, где, как в контроллере, это не так.