Laravel-запрос со сложной схемой БД - PullRequest
0 голосов
/ 03 октября 2018

Задача (сокращенно): Создать запрос для соискателей, у которых отсутствуют документы

Сущности и важные поля

  1. Соискатель(id),
  2. Профессия (id, jobseeker_id),
  3. Назначение (id, jobseeker_id, профессия_id, location_id, Employer_id),
  4. Документ (идентификатор, jobseeker_id, document_category_id),
  5. DocumentCategory (идентификатор, имя)
  6. Местоположение (идентификатор)
  7. Работодатель (идентификатор)

Отношения

  1. Соискатель имеет много профессий (jobseeker_id)
  2. Соискатель имеет много назначений (jobseeker_id)
  3. Соискатель имеет много документов (jobseeker_id)
  4. Профессия имеет много назначений (профессия_id) *
  5. Назначение принадлежит работодателю (Employer_id)
  6. Назначение принадлежит к местоположению (location_id)
  7. DocumentCategory имеет много работодателей (многие ко многим)
  8. DocumentCategory hasMany Locations (многие ко многим)

Описание (упрощенно)

У соискателя есть основная профессия, которая является последнейУ соискателя есть основное назначение, которое является последним назначением для последней профессии

Соискателю необходимо иметь документы определенной категории документов, которые можно найти через его / ее основное назначение следующим образом:

  1. DocumentCategory-> работодатели должны содержать main Назначение-> работодатель
  2. DocumentCategory-> местоположения должны содержать main Назначение-> местоположение

Если эти утверждения верны, тогда требуется DocumentCategory, иначе документы этой DocumentCategory отсутствуют

Вопрос / проблема (расширенная)

Я должен сделать два запросав БД:

  1. Выбрать всех соискателей, у которых есть хотя бы один , отсутствует documentCategory (У них ноль документов по крайней мере для одной требуемой категории)
  2. Получить всех соискателей, у которых есть определенный документКатегория отсутствует .(Когда задано имя documentCategory)

Это должны быть запросы, я не могу постобработать для фильтрации полученных данных, потому что вся задача находится в контексте, где пара запросов (вместе с моим) применяются один за другим для фильтрации конкретных лиц, ищущих работу.

То, что я пробовал

  1. Для конкретного имени:

    $jobseekers = Jobseeker
        ::whereDoesntHave('documents', function($query) use($documentCategoryName) {
            $query->whereHas('documentCategory', function ($query) use ($documentCategoryName) {
                $query->whereName($documentCategoryName);
            });
        });
    

    Я думаю, яследует выбрать всех соискателей, которые имеют определенную категорию документа как обязательный и внутренне объединить их с вышеупомянутым запросом для фильтрации, но пока не может понять, как это сделать, поскольку трудно выбрать основное назначение по запросу.

  2. Если имя не указано, и мы выбираем соискателей, у которых отсутствуют документы хотя бы для одной из категорий, я тоже застрял здесь.Мы не можем использовать whereDoesntHave, потому что, если соискатель имеет хотя бы одну обязательную documentCategory, он не будет извлечен или, по крайней мере, должен быть какой-то обходной путь, которого я пока не знаю.

PS

Вся система отношений и границ довольно большая.Архитектура довольно сложная и неудобная для работы через SQL.Я пытался пропустить как можно больше нечетной информации для своего вопроса, пожалуйста, спросите, есть ли что-то, что я описал недостаточно или неясно.Спасибо!

...