Necesito obtener resultados de base de datos donde la pregunta respondida_en (fecha) es en sí misma más algunos días, de una columna. He intentado mucho usando Carbon y también mysql INTERVAL pero me quedo atascado en la sintaxis.

Estoy usando Laravel 6 y Carbon.

Tengo una tabla llamada "preguntas" y desde allí me gustaría obtener la identificación de una pregunta que fue respondida_en una fecha determinada más una cantidad de días que tengo en otra columna llamada "repetir".

Algo como esto:

->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))

Sin embargo, no puedo simplemente escribir "repetir", ya que no lo reconoce como una tabla. Si escribo un número allí, realmente funciona.

Esto funciona:

->where( 'answered_at', '<', Carbon::now()->subDays(10))

Pero dado que la cantidad dinámica de días para agregar a una fecha proviene de la base de datos, debo tenerla como un campo dinámico. Sin embargo, he intentado obtenerlo antes de la consulta y usarlo como una variable $, eso crea dos consultas mysql diferentes y significaría un mal rendimiento.

Así que me gustaría que esto funcionara, sin embargo, no puedo entender la sintaxis:

->where( 'answered_at', '<', Carbon::now()->subDays('COLUMN_REPEAT_FROM_DB'))

También he probado esto:

->whereRaw("DATE_ADD(answered_at, INTERVAL 10 DAY) <= NOW()")

Que funciona, pero el INTERVALO 10 DÍAS está codificado y

->whereRaw("DATE_ADD(answered_at, INTERVAL 'repeat' DAY) <= NOW()")

Tampoco funciona ... ¡sintaxis!

La consulta completa se ve así:

$question = \DB::table('questions')
     ->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))
     ->value('answered_at');

(Recibo contestado_at como valor solo para ver qué fecha sale para probarla, cambiará a id más tarde y pasará a otra función).

¡Cualquier consejo muy apreciado!

0
Rbbn 15 oct. 2019 a las 23:02

1 respuesta

La mejor respuesta

Estaba en el camino correcto con su última consulta, pero utilizó comillas incorrectas.

En su lugar, debe usar comillas inversas para especificar el nombre de la columna:

$query->whereRaw("DATE_ADD(answered_at, INTERVAL `repeat` DAY) <= NOW()")

Alternativamente, puede usar esta consulta con el mismo resultado:

$query->whereRaw("DATEDIFF(NOW(), answered_at) >= `repeat`")

Sin embargo, el cálculo en sí parece incorrecto. Si desea seleccionar filas que tengan la fecha actual dentro del answered_at + repeat DAYS intervalo, entonces debería estar >= en su consulta y <= en la mía.

0
Styx 15 oct. 2019 a las 21:17