Быстрое извлечение данных из разных таблиц с помощью красноречивых отношений Laravel

Мое приложение с 10 миллионами записей.

Таблица компании:

 +---+------+-----------+-------------+------------+
 |id | name |country_id | industry_id | finance_id |
 +---+------+-----------+-------------+------------+
 | 1 |LOrel |         1 |           1 |          1 |
 +---+------+-----------+-------------+------------+

Таблица страны:

 +---+-----------+
 |id | name      |
 +---+-----------+
 | 1 |  USA      |
 +---+-----------+
 | 2 |  Romania  |
 +---+-----------+

Отраслевая таблица:

 +---+-----------+
 |id | name      |
 +---+-----------+
 | 1 |  Pharmacy |
 +---+-----------+
 | 2 |  Software |
 +---+-----------+

Таблица финансов:

 +---+------------+------+--------+---------+------------+
 |id | company_id | year |revenue | profit  | loss       |
 +---+------------+------+--------+---------+------------+
 | 1 |         1  | 2017 |  4,125 |    2045 |        750 |
 +---+------------+------+--------+---------+------------+
 | 2 |         1  | 2018 | 10,125 |    7045 |        125 |
 +---+------------+------+--------+---------+------------+
 | 3 |         2  | 2017 |  8,125 |    4045 |        750 |
 +---+------------+------+--------+---------+------------+
 | 4 |         3  | 2018 |  7,125 |    2045 |        125 |
 +---+------------+------+--------+---------+------------+

Это моя структура базы данных.

Ожидаемый результат:

 +---------+---------+----------+-----+--------+---------+
 | Country | company | industry |year |revenue | profit  |
 +---------+---------+----------+-----+--------+---------+
 |  USA    |  LOrel  | Pharmacy |2018 | 10,125 |    7045 |
 +---------+---------+----------+-----+--------+---------+

Я получаю тот же результат, что и хочу, я использую жадную загрузку laravel и таблицы данных yajra laravel.

Теперь мне нужно отфильтровать данные с помощью ползунка диапазона, для извлечения данных из БД требуется много времени.

$company_data = Company::whereBetween('revenue',$request->slider)
      ->with('country','industry','company_financial')
     ->skip($request->start)->take($request->length)->get();

заранее спасибо


person Nagraj    schedule 08.02.2018    source источник
comment
Используйте memcached или что-то в этом роде.   -  person Amit Merchant    schedule 08.02.2018
comment
Это нужно часто обновлять или только раз в день?   -  person    schedule 08.02.2018
comment
Я определенно предложил бы переосмыслить ваши решения dbms. Некоторые базы данных NOSQL могут лучше подходить для ваших нужд.   -  person Clijsters    schedule 08.02.2018
comment
@btl Нет необходимости часто обновлять. обновляется еженедельно один раз.   -  person Nagraj    schedule 08.02.2018
comment
В этом случае вы должны запускать его как периодическое задание Queue через Планировщик заданий   -  person    schedule 08.02.2018
comment
@btl я не знаю, как у меня работает очередь. У меня нет большого опыта работы с laravel. Пожалуйста, скажите мне, как это работает.   -  person Nagraj    schedule 09.02.2018
comment
Я отправил ответ с необходимыми шагами   -  person    schedule 09.02.2018


Ответы (1)


Если вам нужно запускать этот запрос нечасто (т. е. раз в неделю), перенесите задачу в очередь . Я бы предложил использовать Redis для драйвера.

Начните с создания задания.

// WeeklyQueryJob.php

protected $slider;
protected $start;
protected $length;

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($slider, $start, $length)
{
    $this->slider = $slider;
    $this->start = $start;
    $this->length = $length;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $company_data = Company::whereBetween('revenue',$this->slider)
                  ->with('country','industry','company_financial')
                  ->skip($this->start)
                  ->take($this->length)
                  ->get();

    // add logic to store/email/whatever the results
}

Затем настройте запланированное задание, чтобы поставить задание в очередь

/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
    $schedule->job(new WeeklyQueryJob)->weekly();
}

Затем добавьте запись в cron для запуска планировщика

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

Наконец, используйте супервизор, чтобы запустить обработчик очереди и поддерживать его работу.

person Community    schedule 09.02.2018
comment
Спасибо за ваш ответ btl, но мне нужно получить данные через ползунковый фильтр. - person Nagraj; 09.02.2018
comment
Никак нельзя это автоматизировать? Вам нужно вручную настраивать его каждый раз? - person ; 09.02.2018
comment
Любые значения легко передать в задание, я включил конструктор, чтобы продемонстрировать, как это сделать. - person ; 09.02.2018
comment
Я передаю диапазон ползунка контроллеру (например, [450,30,000]), он возвращает результат, но занимает много времени. я хочу получить данные быстро. - person Nagraj; 09.02.2018