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

假设我有一个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.*


绝地无双
浏览 132回答 2
2回答

温温酱

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

慕田峪7331174

关于性能,我认为不会有任何变化,因为将执行相同的查询以及将执行相同数量的操作,例如在两种情况下都是foreach()循环O(n),那么会有什么不同,但是您可能想要将您的代码更改为如下所示,或者也可以使用三元运算符。区别在于代码的组织。在控制器中,测试将更加容易。注意:但是和id都将如何,所以让我们将其设为OR而不是AND$user1$user2foreach($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模型和用户中,或者在需要时重新使用。同样对于助手,它可以在控制器中不可重用的地方重用。
打开App,查看更多内容
随时随地看视频慕课网APP