2 回答
TA贡献1752条经验 获得超4个赞
最快的解决方案是不加载不必要的数据:
if(! function_exists('engine'))
{
function engine(int $user1, int $user2, int $league)
{
return League::query()
->where('id', $league)
->whereHas('users', function($query) use ($user1) {
$query->where('id', $user1);
})
->whereHas('users', function($query) use ($user2) {
$query->where('id', $user2);
})
->exists();
}
}
通常,我不认为这样的函数应该返回复杂的结果,例如错误消息。对于此特定作业,应使用控制器动作。助手方法应该只返回true或false以我的观点。您也可以在服务类中放置相同的逻辑(可能是最好的解决方案)。
TA贡献1828条经验 获得超13个赞
关于性能,我认为不会有任何变化,因为将执行相同的查询以及将执行相同数量的操作,例如在两种情况下都是foreach()循环O(n),那么会有什么不同,但是您可能想要将您的代码更改为如下所示,或者也可以使用三元运算符。区别在于代码的组织。在控制器中,测试将更加容易。
注意:但是和id都将如何,所以让我们将其设为OR而不是AND$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();
但是,$ user1和$ user2的ID分别是多少?因此,如果它是OR而不是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模型和用户中,或者在需要时重新使用。同样对于助手,它可以在控制器中不可重用的地方重用。
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报