簡體   English   中英

laravel 5.中的助手與控制器性能

[英]helper vs controller performace in laravel 5.*

假設我有一個名為enginehelper

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();
    }
}

通常,我不認為這樣的函數應該返回復雜的結果,例如錯誤消息。 對於此特定作業,應使用控制器動作。 在我看來,輔助方法應該只返回truefalse 您也可以在服務類中放置相同的邏輯(可能是最好的解決方案)。

關於性能,我認為不會發生任何變化,因為將執行相同的查詢以及將執行相同數量的操作,例如,兩種情況下的foreach()循環均為O(n) ,那么會有所不同,但是您可能希望將代碼更改為如下所示,或者也可以使用三元運算符。 區別在於代碼的組織。 在控制器中,測試將更加容易。

注意:但是id將同時是$user1$user2 ,所以我們將其設為OR而不是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;
    }
}

如果要使用user1_okuser2_ok來獲取引擎, user1_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模型中並供用戶使用,或者在需要時重新使用。 同樣對於助手,它可以在控制器中不可重用的地方重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM