php - obtener - poner fecha en laravel




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

@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 .

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);
});

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


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();




datetime-format