2016-09-09 3 views
0

Webapp, который имеет одну медленную функцию.Как ускорить запрос Mysql с помощью laravel

Прошу предложить код для ускорения этой функции с 5-6 секунд до 1-2 секунд.

У меня есть база данных с таблицами:

стол: Workers (идентификатор, фи rst_name, last_name)

стол: Магазины (номер, имя)

стол: worker_store (идентификатор, worker_id, store_id)

Идея состоит в том, что работники подключены к одному или нескольким магазинам через таблицу worker_store.

В приложении Laravel У меня есть функция, которая берет один магазин и показывает, что рабочие подключены к этому конкретному магазину. Это должно отображаться как «выбрать» поле с подключенными рабочими, отмеченными как «выбранные», и всеми другими работниками, которые не выбраны. Мой ледовый код Laravel выглядит так:

<select multiple name="workers[]" id="workers" class="form-control"> 
@foreach (App\Worker::orderBy('last_name')->get() as $worker)        
    <option value="{{$worker->id}}" 
    **@if ($object->hasWorker($worker->id))          
    selected @endif**>{{$worker->getName()}} 
    </option>   
@endforeach 


</select> 

База данных MySQL и рабочий стол имеет 30 000 записей. Это очень медленно, в то время как laravel составляет 30 000 отдельных запросов к базе данных, чтобы проверять каждого работника, если он связан с определенным хранилищем (выделена жирная часть кода выше).

Пожалуйста, предложите решение, в котором не требуется запрашивать базу данных за 30 000 раз и произвести полное заполнение в течение не более 1-2 секунд (текущий код занимает около 5-6 секунд).

+1

Показать код, который вы используете, какие запросы рабочих. Также посмотрите здесь ... https://laravel.com/docs/5.3/eloquent-relationships#eager-loading – user3158900

+0

mycode есть в моем Вопросе – Hassaan

+0

@Guanapado Pado, почему бы вам не использовать Datatable и laravel paginate. здесь примеры, которые могут помочь вам реализовать в вашем проекте. [https://github.com/yajra/laravel-datatables] [https://datatables.net/examples/server_side/post.html] [https://laravel.com/docs/5.3/pagination] – Manish

ответ

0

Это было бы много, чтобы положить в представлении, но вот основная концепция того, что я думаю, что вы ищете ...

// Grab all the workers so that we can loop through them. 
$workers = App\Worker::all(); 

// Grab a list of the worker id's for the store we are currently searching for. 
$storeWorkers = App\Store::with('workers')->find(1)->workers->lists('id'); 

// Use in_array to determine if the worker is currently working in the store we are looking at. 
@foreach ($workers as $worker) 
    <option value="{{ $worker->id }}" {{ in_array($worker->id, $storeWorkers) ? 'selected' : '' }}>{{ $worker->name }}</option> 
@endforeach 

Это должно принести вам в общей сложности 3 запросов. 1, чтобы схватить всех рабочих и 2, чтобы захватить рабочих в магазине.

Казалось бы, ваши модели настроены неправильно. В вашей Store модели, добавить функцию ...

public function workers() 
{ 
    return $this->belongsToMany(Worker::class, 'worker_store'); 
} 
+0

Thnx, я попробую ваш предложенный код и посмотрю, работает ли он. – Hassaan

+0

как я понимаю $ работников .... и $ storeWorkers ... должен перейти к контроллеру и @foreach к шаблону blade-сервера – Hassaan

+0

Да, возможно, это будет лучше – user3158900

0

Я думаю, что вы должны заново подумать, как вы сделали это заявление.

Невозможно использовать 30 тыс. Опций для выбора, кто будет проходить через 30 тыс. Опций выбора и включения опций? Кто бы даже прочитал эти варианты?
Это не имеет смысла, это приложение, которое невозможно использовать. И зачем вы делаете приложение, которое никто не может использовать?

Прежде всего вам нужно подумать о проблеме, а затем о том, как решить проблему, как ваше решение действительно поможет кому-то решить проблему, а не вызвать более сложную проблему. Выбрасывание всех данных не является решением ни для чего.

Возможно, вам стоит подумать о AJAX/React/Vue.js или аналогичной вещи, которая позволяет пользователю взаимодействовать с данными в терминах, которые имеют смысл.

Но это требует времени, поэтому вы можете хотя бы быстро его решить, создав вместо этого страницу, на которой вы могли бы фильтровать работников на основе имени или чего-то еще, а затем использовать разбиение на страницы, причем каждый вариант имеет флажок рядом с ним, если выбрано или нет, и разрешено выбирать дополнительные значения или вместо флажка - цвет или значок, указывающий текущий статус и кнопку для добавления/удаления.

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

Примечание: также убедитесь, что у вас есть индексы в базе данных в каждом столбце, которые относятся к другим данным, каждому заказу, каждому столбцу, который вы используете для фильтрации.

Ваша проблема не столько запрос, как это огромное количество данных, которые вы выбрасываете в HTML

+0

Сэр. Фактически, я решил получить результат через 0,8 секунды, и это было сделано, следуя процедуре, определенной пользователем3158900 выше, но теперь у меня есть проблема с laravel socialite plugin. Скажите, пожалуйста, помогите мне. Можете ли вы мне помочь? laravel socialite plugin. Я поставил вопрос, но ни один человек не ответил на это. Может, вы увидите эту ссылку http://stackoverflow.com/questions/39425687/laravel-socialite-doesnt-take-get-parameter-to- redirect-on-same-page для справки и ответа там. Я буду благодарен вам – Hassaan

+0

: «Огромное количество данных, которые вы бросаете в HTML» , если вы не вступили в это раньше, это может повредить ваш сайт и заставить вас перепроектировать все ... поэтому имейте в виду, сколько данных может появиться в будущем. , , , , – Andrew