Я получаю данные из своей базы данных, используя Datatable, но загрузка занимает слишком много времени - PullRequest
0 голосов
/ 05 апреля 2020

Я получаю данные из таблицы продуктов, я использую paginate в datatable, который показывает только 50 записей в первый раз, а при обновлении пейджера на 200 строк это занимает от 12 до 13se c. Вот мой код. Заранее спасибо

    $query = Product::query();
    $query->with('def_or_last_supplier','units','prouctImages','productType',
    'productBrand','productSubCategory',
    'supplier_products','productCategory')
    ->where('status',1)->orderBy('refrence_no', 'DESC');

    if($request->default_supplier != '')
    {
        $supplier_query = $request->default_supplier;
        $query = $query->whereIn('id', SupplierProducts::select('product_id')->where('supplier_id',$supplier_query)->pluck('product_id'));
    }

    if($request->prod_type != '')
    {
        $query->where('type_id', $request->prod_type)->where('status',1)->orderBy('refrence_no', 'DESC');
    }

    if($request->prod_category != '')
    {
        $query->where('category_id', $request->prod_category)->where('status',1)->orderBy('refrence_no', 'DESC');
    }

    if($request->filter != '')
    {
        if($request->filter == 'stock')
        {
            $query = $query->whereIn('id',WarehouseProduct::select('product_id')->where('current_quantity','>',0.005)->pluck('product_id'));
        }
        elseif($request->filter == 'reorder')
        {
            $query->where('min_stock','>',0);
        }
    }

1 Ответ

0 голосов
/ 05 апреля 2020

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

1: в моем опыте: попробуйте select свои поля отношений тоже вы можете сделать это так

Источник

Product::with('def_or_last_supplier',
    'units:id,created_at,updated_at', // Just add :field_1,field_2,another_field
    'prouctImages:id,field_1,field_2'
    ....
)

2: Я предлагаю вам взять преимущество lazy loading. если это возможно, не стесняйтесь загружать все ваши отношения сразу, загружайте их там, где это необходимо

Источник

$products = Product::get()

В лезвие или где-то в приложении
при особых условиях мне нужен доступ к моим отношениям, я легко могу сделать это с помощью
$products->load('my_relation_name')

3: I увидеть в вашем коде множество предложений orderyBy, и вы можете index заполнить поля, которые можно искать или которые нужно упорядочить. это можно сделать, добавив ->index() в свой файл миграции

Источник

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('refrence_no')->index();
        $table->timestamps();
    });
}

4: и, наконец, вы всегда можете попробовать кэшируйте ваши запросы, чтобы предотвратить ненужные запросы к базе данных, вот как работает кеш

source

$products = Cache::remember('cache_name', $how_long_in_seconds, function () {
    return Product::get();
});

И, наконец, вот красноречивый способ вашего запроса

$query = \Cache::remember(json_encode($request->toArray()), 300, function () use ($request) {
    return Product::with('def_or_last_supplier',
        'units',
        'prouctImages',
        'productType',
        'productBrand',
        'productSubCategory',
        'supplier_products',
        'productCategory'
    )
        ->where('status', 1)
        ->orderByDesc('refrence_no')
        ->when($request->filled('default_supplier'),  function (Builder $query) use ($request) {
            $productIds = SupplierProducts::select('product_id')->where('supplier_id', $request->input('default_supplier'))->pluck('product_id');
            $query->whereIn('id', $productIds);
        })->when($request->filled('prod_type'),  function (Builder $query) use ($request) {
            $query->where('type_id', $request->input('prod_type'))->where('status', 1)->orderByDesc('refrence_no');
        })->when($request->filled('prod_category'),  function (Builder $query) use ($request) {
            $query->where('category_id', $request->input('prod_category'))->where('status', 1)->orderByDesc('refrence_no');
        })->when($request->filled('filter'),  function (Builder $query) use ($request) {
            $query->when('stock' === $request->input('filter'),  function (Builder $query) {
                $query->whereIn('id', WarehouseProduct::select('product_id')->where('current_quantity', '>', 0.005)->pluck('product_id'));
            })->when('reorder' === $request->input('filter'),  function (Builder $query) {
                $query->where('min_stock', '>', 0);
            });
        })->get();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...