хелпер против производительности контроллера в laravel 5. * - PullRequest
0 голосов
/ 28 апреля 2019

Предположим, у меня есть 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 ]

2 голосов
/ 28 апреля 2019

Самым быстрым будет решение, которое не загружает ненужные данные:

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.Вы также можете разместить ту же логику в классе обслуживания (возможно, лучшее решение).

1 голос
/ 28 апреля 2019

Что касается производительности, я не думаю, что будут какие-либо изменения, так как будет выполнен один и тот же запрос, а также будет выполнено одинаковое количество операций, например, цикл 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 и пользователя или использовать его при необходимости.Также для помощника, он может быть повторно использован, где, как в контроллере, это не так.

...