Фильтр построителя запросов на основе суммы связанных записей

#php #mysql #laravel #octobercms #laravel-query-builder

#php #mysql #ларавель #октябрьские #laravel-конструктор запросов

Вопрос:

Я был бы признателен за некоторую помощь в построении запросов laravel/octobercms. У меня есть две модели/таблицы, как показано ниже:

Модель CV имеет много опыта, модель опыта принадлежит CV.

 CVs table  | id | user_id |  | --- | ------ |  | 1 | 11 |  | 2 | 22 |     Experiences table  | id | cv_id | from | to |  | --- | ------ | ----- | --- |  | 1 | 1 | 2019-01-01 | 2020-01-01 |  | 2 | 1 | 2020-05-02 | 2021-09-01 |  | 3 | 2 | 2019-01-01 | 2019-05-01 |  | 4 | 2 | 2020-01-01 | 2021-05-01 |   

Я пытаюсь использовать конструктор запросов для фильтрации резюме на основе продолжительности опыта. Например, резюме с идентификатором: 2, имеет два опыта работы с идентификаторами 3 и 4, каждый с опытом работы 4 мотылька, поэтому в общей сложности резюме с идентификатором: 2 имеет опыт работы 8 месяцев.

До сих пор я пробовал варианты:

 $query = Cv::query()-gt;whereHas('experiences', function ($query) {  $query-gt;addSelect(DB::raw("SUM(DATEDIFF(COALESCE(`to`, CURDATE()), `from`)) AS sum_experience"));  });  

Вышеизложенное производит:

 select * from `cvs` where exists (select *, SUM(DATEDIFF(COALESCE(`to`, CURDATE()), `from`)) AS sum_experience from `cv_expriences` where `cvs`.`id` = `cv_expriences`.`cv_id`)  

Но я не знаю, как я могу сравнить значение sum_experience со значением, которое мне нужно. Любая помощь будет признательна.

Комментарии:

1. Я хотел бы дать одно предложение, если это возможно, вы должны рассчитать опыт за месяц при добавлении/обновлении … и добавьте его непосредственно в таблицу резюме, это упростит вам управление и поиск по нему, а менее сложный запрос к БД увеличит время отклика …

2. это может показаться излишним, но когда вы масштабируете свой проект, эти запросы будут создавать проблемы …

3. Спасибо за предложение, я думал об этом как о последнем решении. Может быть, мне следовало подумать об этом в первую очередь.

4. это было бы лучше всего, так как это значительно облегчит вашу жизнь, а запросы будут очень простыми 🙂

Ответ №1:

Было бы здорово, если бы вы могли просто calculate experience in a month добавлять/обновлять записи Experiences table и добавлять их непосредственно в CV table .

Это действительно упростит вам управление и поиск с его помощью, а less complex запросы к БД увеличат время отклика

если у вас есть какие-либо сомнения, пожалуйста, прокомментируйте.

Комментарии:

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

2. так что вы можете просто рассчитать на основе текущих данных и заполнить данные, я думаю …