让我们假设我有一个名为helper
的engine
。
if( ! function_exists('engine') )
{
function engine($user_id_1, $user_id_2, $league, $log = true)
{
/*
* variables
*/
$questionsLevel = 1;
$user1 = \App\User::where('id', $user_id_1)->first();
$user2 = \App\User::where('id', $user_id_2)->first();
$league = \App\Models\League::where('id', $league)->first();
$users = $league->all_users;
/*
* check if users joined to league correctly
*/
$user1_ok = $user2_ok = false;
foreach($users as $user)
{
if( $user->id == $user_id_1 )
{
$user1_ok = true;
}
if( $user->id == $user_id_2)
{
$user2_ok = true;
}
$check_users = [
$user1_ok,
$user2_ok
];
}
if( in_array(false, $check_users) )
{
return [
'errcode' => 404,
'errmessage' => 'one ro both user/s did not joined to league'
];
}
//DO SOME STUFF
}//function engine
}
如你所知,我可以写一个controller
来做同样的事情。
有谁知道基于Laravel架构哪个更快?如何在两种情况下测试性能?
我正在使用laravel 5.7.*
最快的是不加载不必要数据的解决方案:
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
。您也可以在服务类中放置相同的逻辑(可能是最佳解决方案)。
关于性能,我认为不会有任何更改,因为将执行相同的查询以及将执行相同数量的操作,例如foreach()
循环在两种情况下都是O(n)
,所以会有什么不同,但是您可能希望将代码更改为类似下面的代码,也可以使用三元运算符。不同之处在于代码的组织。在控制器中,测试将更容易。
注意:但是id
将是$user1
和$user2
,所以让它代替AND而不是AND
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;
}
}
如果你想让工程师使用qazxsw poi,qazxsw poi,你可能想像@Namoshek所建议的那样运行查询。
或者您可能希望将查询更改为类似的内容
user1_ok
但是,如果id为$ user1和$ user2,那么,如果它是OR而不是AND。
user2_ok
甚至League::query()->where('id', $league)
->whereHas('users', function($query) use ($user1, $user2) {
$query->where('id', $user1)->where('id', $user2);
})->exists();
和
League::query()->where('id', $league)
->whereHas('users', function($query) use ($user1, $user2) {
$query->whereIn('id', [$user1, $user2]);
})->exists();
顺便说一下,如果你想使用这些查询,你可以将它放在引擎模型和用户中,或者在需要时重用它。对于帮助者来说,它可以重复使用,而不是在控制器中。