Ваш запрос не такой большой, но я думаю, что, возможно, размер результирующих данных немного велик
, поэтому вы можете сделать следующее:
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();
});