Соответствующие модели :
Модель Person
Модель Person имеет связь lastVisit. , который извлекает данные о последнем посещении данного человека:
Код: Выделить всё
public function lastVisit()
{
return $this->hasOne(VisitData::class)->latest('visit_date');
}
Модель VisitData хранит информацию о посещениях, включая visit_status_id:
Код: Выделить всё
class VisitData extends Model implements Auditable
{
use \OwenIt\Auditing\Auditable;
use HasFactory;
protected $fillable = [
'visit_id',
'person_id',
'visit_status_id',
'refuse_reason_id',
'comment',
'visit_date'
];
public function visit(){
return $this->belongsTo(Visit::class);
}
public function person(){
return $this->hasOne(Person::class, 'id', 'person_id');
}
public function visitStatus(){
return $this->hasOne(VisitStatus::class, 'id', 'visit_status_id');
}
}
**
В методе index моего контроллера я фильтрую людей по нескольким критериям, включая visit_status_id< /strong> последнего посещения:
Код: Выделить всё
$persons = Person::with('vulnerabilityGroup', 'gender', 'documentType', 'citizenship', 'family', 'lastVisit.visit', 'lastVisit.visitStatus')
->withCount('documents', 'verifiedMember')
** ->when($visitStatus, function ($query) use ($visitStatus) {
return $query->whereHas('lastVisit', function ($q) use ($visitStatus) {
$q->where('visit_status_id', $visitStatus);
});
})**
->paginate(30);
Код: Выделить всё
•Performance: This query works fine on my local environment but is slow when running on the server.
•Filtering by Status: $visitStatus comes from the opt_visit_statuses table and represents the id field. There are four possible IDs (1, 2, 3, 4). I’m concerned that this filtering might be causing the slowdown.
**
Что еще я могу сделать, чтобы улучшить производительность этого запроса на сервере? Что-то не так с тем, как я фильтрую данные по visit_status_id с помощьюwhereHas? Можно ли дополнительно оптимизировать то, как я веду отношения?
Дополнительная информация
Код: Выделить всё
•.I’m using Laravel 8.
•.The database engine is MySQL.
•.The visit_status_id is indexed, and I’ve confirmed the IDs (1, 2, 3, 4) exist and are correct.
Шаги, которые я предпринял
- Индексация: я добавил индекс в столбец visit_status_id в таблице visit_data.
- Оптимизированное взаимодействие: я скорректировал метод LastVisit, чтобы вместо него использовать последний('visit_date') ofMany(), чтобы убедиться, что я получаю последнее посещение.
3.Проверено на наличие значений NULL: я проверил, что поле visit_status_id не содержит неожиданных значений NULL.
4.Желаю загрузки: я нетерпеливо загружает связь LastVisit, чтобы уменьшить количество запросов.
Подробнее здесь: https://stackoverflow.com/questions/790 ... erehas-wit
Мобильная версия