Laravel Улучшение производительности построителя запросов или красноречивый - PullRequest
1 голос
/ 25 марта 2020

У меня есть следующие таблицы для связи многих со многими (ссылка на диаграмму ниже)

имя таблицы applications, applicants, applicant_application

applications table

  id  | stage   | 
------+----------------------------------------------------
  1   |   1     |
  2   |   2     |
  .
  .
  .
___________________________________________________________

applicants table

  id  | user_id  | 
------+--------------------------------------------------
  1   |    27    |
  2   |    12    |
.
.
.
___________________________________________________________

applicant_application table (pivot table for eloquent)

applicant_id | application_id | 
-------------+-------------------------------------------
      1      |       1        |
      2      |       2        |
      .
      .
      .

applications и applicants являются независимыми таблицами, которые связаны с applicant_application

То, что я пытаюсь сделать, это перечислить всю таблицу stages из applications и соответствующий ей счет, но с дополнительным условием, где информация находится в applicants таблице

Вот мой код построителя запросов, я использую построитель запросов, так как я не совсем уверен, как этого добиться с помощью eloquent. вы также заметите, что я тяну только эту стадию 1,13, и есть всего 13 различных стадий

$id = 27;

$stages = DB::query()
    ->select('apt.stage', DB::raw('count(apt.id) as count'))
    ->from('applications as apt')
    ->where('apt.stage', 1)->orWhere('apt.stage', 13)
    ->leftJoin('applicant_application as aa', 'aa.application_id', '=', 'apt.id')
    ->join('applicants as app', function($join) use ($id) {
        $join->on('aa.applicant_id', 'app.id')
        ->where('app.user_id', $id);
        })
    ->groupBy('apt.stage')
    ->orderBy('count', 'DESC')
    ->get();

return $stages;

Приведенный выше код прекрасно работает со следующим выводом


|stage | Count |
-------+-------+
|  13  |  187  |
|  1   |  180  |
-------+--------

Тем не менее, моя главная проблема здесь - скорость, загрузка, кажется, занимает довольно много времени, я выполнил тот же запрос непосредственно по команде SQL, и для загрузки * требуется 1,929 секунды. 1028 * Не считайте, что в моей базе данных содержится более 500 000 заявителей и более 500 000 записей о заявках, у Applicant_application около 700 000 +

. Теперь мой вопрос: как лучше добиться этого для лучшей скорости? и как я могу добиться этого с помощью Eloquent?

признателен за любую помощь:)

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