Задача (сокращенно): Создать запрос для соискателей, у которых отсутствуют документы
Сущности и важные поля
- Соискатель(id),
- Профессия (id, jobseeker_id),
- Назначение (id, jobseeker_id, профессия_id, location_id, Employer_id),
- Документ (идентификатор, jobseeker_id, document_category_id),
- DocumentCategory (идентификатор, имя)
- Местоположение (идентификатор)
- Работодатель (идентификатор)
Отношения
- Соискатель имеет много профессий (jobseeker_id)
- Соискатель имеет много назначений (jobseeker_id)
- Соискатель имеет много документов (jobseeker_id)
- Профессия имеет много назначений (профессия_id) *
- Назначение принадлежит работодателю (Employer_id)
- Назначение принадлежит к местоположению (location_id)
- DocumentCategory имеет много работодателей (многие ко многим)
- DocumentCategory hasMany Locations (многие ко многим)
Описание (упрощенно)
У соискателя есть основная профессия, которая является последнейУ соискателя есть основное назначение, которое является последним назначением для последней профессии
Соискателю необходимо иметь документы определенной категории документов, которые можно найти через его / ее основное назначение следующим образом:
- DocumentCategory-> работодатели должны содержать main Назначение-> работодатель
- DocumentCategory-> местоположения должны содержать main Назначение-> местоположение
Если эти утверждения верны, тогда требуется DocumentCategory, иначе документы этой DocumentCategory отсутствуют
Вопрос / проблема (расширенная)
Я должен сделать два запросав БД:
- Выбрать всех соискателей, у которых есть хотя бы один , отсутствует documentCategory (У них ноль документов по крайней мере для одной требуемой категории)
- Получить всех соискателей, у которых есть определенный документКатегория отсутствует .(Когда задано имя documentCategory)
Это должны быть запросы, я не могу постобработать для фильтрации полученных данных, потому что вся задача находится в контексте, где пара запросов (вместе с моим) применяются один за другим для фильтрации конкретных лиц, ищущих работу.
То, что я пробовал
Для конкретного имени:
$jobseekers = Jobseeker
::whereDoesntHave('documents', function($query) use($documentCategoryName) {
$query->whereHas('documentCategory', function ($query) use ($documentCategoryName) {
$query->whereName($documentCategoryName);
});
});
Я думаю, яследует выбрать всех соискателей, которые имеют определенную категорию документа как обязательный и внутренне объединить их с вышеупомянутым запросом для фильтрации, но пока не может понять, как это сделать, поскольку трудно выбрать основное назначение по запросу.
Если имя не указано, и мы выбираем соискателей, у которых отсутствуют документы хотя бы для одной из категорий, я тоже застрял здесь.Мы не можем использовать whereDoesntHave, потому что, если соискатель имеет хотя бы одну обязательную documentCategory, он не будет извлечен или, по крайней мере, должен быть какой-то обходной путь, которого я пока не знаю.
PS
Вся система отношений и границ довольно большая.Архитектура довольно сложная и неудобная для работы через SQL.Я пытался пропустить как можно больше нечетной информации для своего вопроса, пожалуйста, спросите, есть ли что-то, что я описал недостаточно или неясно.Спасибо!