poner obtener hora guardar for fecha como ciclo año automatica actual php mysql laravel eloquent datetime-format

php - guardar - obtener hora actual laravel



Laravel $ q-> where() entre fechas (4)

Estoy intentando que mi cron solo obtenga Projects que se deben repetir / renovar en los próximos 7 días para enviar correos electrónicos de recordatorio. Acabo de descubrir que mi lógica no funciona.

Actualmente tengo la consulta:

$projects = Project::where(function($q){ $q->where(''recur_at'', ''>'', date("Y-m-d H:i:s", time() - 604800)); $q->where(''status'', ''<'', 5); $q->where(''recur_cancelled'', ''='', 0); });

Sin embargo, me di cuenta de que lo que tengo que hacer es algo como:

Psudo SQL:

SELECT * FROM projects WHERE recur_at > recur_at - ''7 days'' AND /* Other status + recurr_cancelled stuff) */

¿Cómo puedo hacer esto en Laravel 4, y utilizando el tipo de datos DATETIME, solo he hecho este tipo de cosas usando marcas de tiempo?

Actualizar:

Gestionado para resolver esto después de usar el siguiente código, Stackoverflow también ayuda cuando puede extraer bits de código y mirarlos fuera de contexto.

$projects = Project::where(function($q){ $q->where(DB::raw(''recur_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()'')); $q->where(''status'', ''<'', 5); $q->where(''recur_cancelled'', ''='', 0); });

Pregunta actualizada: ¿Hay una mejor manera de hacer esto en Laravel / Eloquent?

Actualización 2:

La primera resolución no fue correcta después de más pruebas, ahora he resuelto y probado la siguiente solución:

$projects = Project::where(function($q){ $q->where(''recur_at'', ''<='', Carbon::now()->addWeek()); $q->where(''recur_at'', ''!='', "0000-00-00 00:00:00"); $q->where(''status'', ''<'', 5); $q->where(''recur_cancelled'', ''='', 0); });


@Tom: en lugar de usar ''ahora'' o ''addWeek'' si proporcionamos la fecha en el siguiente formato, no da los registros correctos

$projects = Project::whereBetween(''recur_at'', array(new DateTime(''2015-10-16''), new DateTime(''2015-10-23''))) ->where(''status'', ''<'', 5) ->where(''recur_cancelled'', ''='', 0) ->get();

da registros que tienen fecha del 2015-10-16 a menos de 2015-10-23. Si el valor de recur_at es 2015-10-23 00:00:00 entonces solo muestra ese registro si es 2015-10-23 12:00:45 y luego no se muestra .


Editado: tenga en cuenta que
whereBetween(''date'',$start_date,$end_date)
incluye la primera fecha.


No quería meterse con el carbón. Así que aquí está mi solución

$start = new /DateTime(''now''); $start->modify(''first day of this month''); $end = new /DateTime(''now''); $end->modify(''last day of this month''); $new_releases = Game::whereBetween(''release'', array($start, $end))->get();


Puede encadenar su ubicación directamente, sin function(q) . También hay un buen paquete de manejo de fechas en laravel, llamado Carbon . Entonces podrías hacer algo como:

$projects = Project::where(''recur_at'', ''>'', Carbon::now()) ->where(''recur_at'', ''<'', Carbon::now()->addWeek()) ->where(''status'', ''<'', 5) ->where(''recur_cancelled'', ''='', 0) ->get();

Solo asegúrese de que necesita Carbon en el compositor y está usando el espacio de nombres Carbon (use Carbon / Carbon;) y debería funcionar.

EDITAR: Como dijo Joel , podrías hacer:

$projects = Project::whereBetween(''recur_at'', array(Carbon::now(), Carbon::now()->addWeek())) ->where(''status'', ''<'', 5) ->where(''recur_cancelled'', ''='', 0) ->get();