有很多类似的主题,但找不到适合我的解决方案。该查询加载速度非常慢。
public function getAllBids()
{
return Bid::with('user', 'group')
->join('auct_lots', function ($join) {
$join->on('bids.lot_id', '=', 'auct_lots.lot_id')
->where('auct_lots.company', 'LIKE', '%' . request('brand') . '%')
->where('auct_lots.model_name', 'LIKE', '%' . request('models') . '%')
->where('auct_lots.grade_en', 'LIKE', '%' . request('carGrade') . '%')
->where('auct_lots.auction_name', 'LIKE', '%' . request('auctions') . '%')
->where('auct_lots.model_type_en', 'LIKE', '%' . request('chassis') . '%')
->where('auct_lots.bid', 'LIKE', '%' . request('lots') . '%')
->where('auct_lots.lot_date', 'LIKE', '%' . request('date') . '%');
})
->orderBy('auct_lots.' . request('order_column'), request('order_type'))
->paginate(30);
}
我认为问题是auct_lots
拥有40,000多个记录...但是我不确定如何重构此代码以更快地工作。
答案 0 :(得分:1)
当您有大量数据时,最好使用服务器端缓存。这样可以更快地提高性能。
第1步:创建特性并为缓存中的存储值编写逻辑。 例如:
trait Student{
public function storeStudentDataInCache(){
$students = Cache::rememberForever('studentList', function () {
return Student::
with(['class', 'exams'])
->where('is_published', 1)->orderBy('display_sequence', 'ASC')->get();
});
return $students;
}
}
现在在您的控制器中调用此方法,它将返回数据收集。因此,您不需要一直运行sql查询来获取数据。此方法将仅在一次后运行查询。之后,数据将存储在缓存中,因此它将从缓存文本文件中获取数据的集合。
注意:每当您更新数据时,请不要忘记删除此缓存。
您还可以在laravel收集条件的地方应用,或者可以使用收集的filter方法来实现更多的过滤逻辑。