这是我的代码:这个查询太慢了,当我运行它时,我的 MySQL 服务器崩溃了。
->when($this->search, function ($query) {
return $query->where(function ($query) {
$query->where('fullname', 'like', '%'.$this->search.'%')
->orWhere('phone', 'like', '%'.$this->search.'%')
->orWhere('email', 'like', '%'.$this->search.'%')
->orWhereHas('services', function ($query) {
$query->where('number', 'like', '%'.$this->search.'%');
});
});
})
我使用 php 8.1.4,我想搜索数字形式关系,如何在没有 whereHas 的情况下做到这一点?
如果您的服务表不多,那应该不是问题,但如果它很大,您可能需要按数字预查询和缓存服务表,例如
if (is_numeric($this->search)) {
//10 minutes cache
$servicesByNumber = Cache::remember('sbnum_'.$this->search, 600, function() {
//replace foreign_id below with actual foreign key
return Service::where('number', 'like', "%$this->search%")->pluck('foreign_id');
});
}
然后
->when($this->search, function ($query) {
$query->where(function ($query) {
$query->where('fullname', 'like', '%'.$this->search.'%')
->orWhere('phone', 'like', '%'.$this->search.'%')
->orWhere('email', 'like', '%'.$this->search.'%');
if (isset($servicesByNumber))
$query->orWhereIn('id', $servicesByNumber);
});
})