Filtro del generador de consultas basado en la suma de registros relacionados.
Agradecería ayuda con respecto al constructor de consultas de Laravel/OctoberCMS.
Tengo dos modelos/tablas de la siguiente manera:
El modelo CV tiene muchas Experiencias, el modelo Experiencia pertenece a CV.
Tabla CVs
id | user_id |
---|---|
1 | 11 |
2 | 22 |
Tabla Experiencias
id | cv_id | desde | hasta |
---|---|---|---|
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 |
Estoy intentando usar el constructor de consultas para filtrar los CVs basados en la duración de las Experiencias. Por ejemplo, el CV con id: 2 tiene dos experiencias con id 3 y 4, cada una con una duración de 4 meses, por lo que en total el CV con id: 2 tiene 8 meses de experiencia.
Hasta ahora he intentado diferentes variaciones de:
$query = Cv::query()->whereHas(‘experiences’, function ($query) {
$query->addSelect(DB::raw(“SUM(DATEDIFF(COALESCE(to
, CURDATE()), desde
)) AS sum_experience”));
});
Lo anterior produce:
select * from cvs
where exists (select *, SUM(DATEDIFF(COALESCE(to
, CURDATE()), desde
)) AS sum_experience from cv_expriences
where cvs
.id
= cv_expriences
.cv_id
)
Pero no sé cómo puedo comparar el valor de sum_experience con un valor que necesito. Agradezco cualquier ayuda.
davy.ai
Solución para el generador de consultas Laravel/OctoberCMS
Para filtrar los CV’s en base a la duración de las experiencias (en meses), puedes utilizar la siguiente consulta:
Esto es lo que hace esta consulta:
cvs
yexperiences
en las columnasid
ycv_id
, respectivamente.cvs.id
, para que cada CV tenga solo una fila.DATEDIFF
para obtener la diferencia entre las fechasto
yfrom
, y dividiendo por 30 para convertir los días en meses.havingRaw
. Ten en cuenta que dividimos por 30 para obtener la duración en meses, y pasamos el valor como un parámetro para evitar la inyección SQL.cvs
.Luego puedes ejecutar la consulta y obtener los resultados de la siguiente manera:
Esto te dará una colección de objetos
Cv
para los CV’s que coincidan con el filtro de duración.Espero que esto te ayude. Hazme saber si tienes alguna pregunta adicional.