¿Cómo consultar entre dos fechas usando Laravel y Eloquent?
Estoy intentando crear una página de informe que muestre informes desde una fecha específica hasta una fecha específica. Aquí está mi código actual:
$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();
Lo que esto hace en SQL simple es select * from table where reservation_from = $now
.
Tengo esta consulta aquí pero no sé cómo convertirla en una consulta elocuente.
SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to
¿Cómo puedo convertir el código anterior en una consulta elocuente?
El whereBetween
método verifica que el valor de una columna esté entre dos valores.
$from = date('2018-01-01');
$to = date('2018-05-02');
Reservation::whereBetween('reservation_from', [$from, $to])->get();
En algunos casos, es necesario agregar un rango de fechas dinámicamente. Según el comentario de @Anovative , puedes hacer esto:
Reservation::all()->filter(function($item) {
if (Carbon::now()->between($item->from, $item->to)) {
return $item;
}
});
Si desea agregar más condiciones, puede usar orWhereBetween
. Si desea excluir un intervalo de fechas, puede utilizar whereNotBetween
.
Reservation::whereBetween('reservation_from', [$from1, $to1])
->orWhereBetween('reservation_to', [$from2, $to2])
->whereNotBetween('reservation_to', [$from3, $to3])
->get();
Otras cláusulas Where útiles: whereIn
, whereNotIn
, whereNull
, whereNotNull
, whereDate
, whereMonth
, whereDay
, , , , .whereYear
whereTime
whereColumn
whereExists
whereRaw
Laravel documenta sobre las cláusulas Where.
Y he creado el alcance del modelo.
Para saber más sobre esto, scopes
consulte los enlaces a continuación:
laravel.com/docs/eloquent#query-scopes
medium.com/@janaksan/using-scope-with-laravel
Código:
/**
* Scope a query to only include the last n days records
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeWhereDateBetween($query,$fieldName,$fromDate,$todate)
{
return $query->whereDate($fieldName,'>=',$fromDate)->whereDate($fieldName,'<=',$todate);
}
Y en el controlador, agregue la Biblioteca Carbon al principio
use Carbon\Carbon;
Para obtener el registro de los últimos 10 días a partir de ahora
$lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(10)->startOfDay()->toDateString(),(new Carbon)->now()->endOfDay()->toDateString() )->get();
Para obtener el registro de los últimos 30 días a partir de ahora
$lastThirtyDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(30)->startOfDay()->toDateString(),(new Carbon)->now()->endOfDay()->toDateString() )->get();
Otra opción si tu campo es datetime
en lugar de date
( aunque funciona para ambos casos ):
$fromDate = "2016-10-01";
$toDate = "2016-10-31";
$reservations = Reservation::whereRaw(
"(reservation_from >= ? AND reservation_from <= ?)",
[
$fromDate ." 00:00:00",
$toDate ." 23:59:59"
]
)->get();
Si desea verificar si la fecha actual existe entre dos fechas en la base de datos: => aquí la consulta obtendrá la lista de aplicaciones si la solicitud del empleado desde y hasta la fecha existe en la fecha de hoy.
$list= (new LeaveApplication())
->whereDate('from','<=', $today)
->whereDate('to','>=', $today)
->get();