Быстрое получение данных из разных таблиц с использованием красноречивых связей 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 eager loading и yajra laravel datatables.

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

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

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

0

Решение

Если вам нужно запускать этот запрос нечасто (то есть раз в неделю), загрузите задачу в очередь. Я бы предложил использовать 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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]