Laravel Увеличить скорость SQL - PullRequest
       4

Laravel Увеличить скорость SQL

0 голосов
/ 12 октября 2018

Я пытаюсь увеличить скорость моих запросов в Laravel 5.7 , и у меня звонок до ~ 2.5 секунд.Я пытаюсь найти больше способов сделать это быстрее, и если бы я мог получить некоторую помощь, я был бы очень признателен.

Спасибо

Как структурированы мои данные: enter image description here

Функция (контроллер):

public function getUserDataTmp(Request $request) {

        $input = file_get_contents("php://input");
        $request = json_decode($input);

        if ($this->authTokenAccess($request) == true) {

            $bottomWords = bottom_exterior_word::select('word','sentence','sequence','id','group_id')->where('user_id','=', $request->id)->get();

            $emergencyWords = left_exterior_word::select('word','sentence','sequence','id')->where('user_id','=', $request->id)->get();

            foreach($bottomWords as $tmp => $key) {
                $group_id = $key->group_id;
                $bottomWords->user_id = $request->id;
                $bottomWords[$tmp]->words = $key->getMainWords($group_id, $request->id);
            }

            foreach($emergencyWords as $key => $word) {
                $emergencyWords[$key]->image = imageModel::select('base64','id')->where('emergency_id','=', $word->id)->first();

            }

            $data = [
                'data' => [
                    'return' => 'success',
                    'code' => 'VEDC001',
                    'response' => 'Successfully Gathered Words',
                    'main_categories' => $bottomWords,
                    'emergency_words' => $emergencyWords
                ]
            ];

            return(json_encode($data));

        }

    }

Функция getMainWords (модель bottom_exterior_word):

    public function getMainWords($group_id, $id)
  {
      // return("TEST");
      $words = \App\main_word::select('id','group_id','sentence','sequence','word')->where('group_id','=', $group_id)->where('user_id','=', $id)->get();
      foreach ($words as $key => $word) {
          $words[$key]->image = Image::select('base64','id')->where('word_id','=', $word->id)->first();
      }
      return $words;
  }

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Старый пост, просто хотел бы обновить его, хотя.С тех пор, как я впервые опубликовал это, я узнал намного больше о Laravel и стал намного опытнее с ним.

Вот мои новые функции и решения:

Контроллер:

public function data(Request $request)
{
    return response()->success(
        [
            'emergencywords' => EmergencyWord::with('image')->whereUserId($request->user()->id)->get(),
            'categorywords' => CategoryWord::with(['image','words.image'])->whereUserId($request->user()->id)->get(),
        ]
    );
}

Категория Слово Отношения:

public function image()
{
    return $this->hasOne('App\Image','id','image_id');
}

public function words()
{
    return $this->hasMany('App\MainWord','category_words_id','sequence');
}

Экстренное слово Отношения:

public function image()
{
    return $this->hasOne('App\Image','id','image_id');
}

Основные слова:

public function image()
{
    return $this->hasOne('App\Image','id','image_id');
}
0 голосов
/ 12 октября 2018

Начните с рефакторинга, чтобы вы не выполняли запросы внутри цикла foreach

foreach($bottomWords as $tmp => $key) {
            $group_id = $key->group_id;
            $bottomWords->user_id = $request->id;
            $bottomWords[$tmp]->words = $key->getMainWords($group_id, $request->id);
        }

. Я бы изменил функцию getMainWords, чтобы она принимала массив идентификаторов групп, и использовал выражение whereIn:

Метод whereIn проверяет, содержится ли значение данного столбца в данном массиве:

$ users = DB :: table ('users') -> whereIn ('id',[1, 2, 3]) -> get ();

То же самое для этого цикла.

        foreach($emergencyWords as $key => $word) {
            $emergencyWords[$key]->image = imageModel::select('base64','id')->where('emergency_id','=', $word->id)->first();

        }

В целом, минимизация количества запросов увеличит время отклика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...