为了账号安全,请及时绑定邮箱和手机立即绑定

laravel 5中的助手与控制器性能

laravel 5中的助手与控制器性能

PHP
绝地无双 2021-05-06 13:15:26
假设我有一个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.*
查看完整描述

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以我的观点。您也可以在服务类中放置相同的逻辑(可能是最好的解决方案)。


查看完整回答
反对 回复 2021-05-21
?
慕田峪7331174

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模型和用户中,或者在需要时重新使用。同样对于助手,它可以在控制器中不可重用的地方重用。


查看完整回答
反对 回复 2021-05-21
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信