¿Cómo consultar entre dos fechas usando Laravel y Eloquent?

Resuelto wobsoriano asked hace 54 años • 15 respuestas

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?

wobsoriano avatar Jan 01 '70 08:01 wobsoriano
Aceptado

El whereBetweenmé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, , , , .whereYearwhereTimewhereColumn whereExistswhereRaw

Laravel documenta sobre las cláusulas Where.

Peter Kota avatar Oct 27 '2015 07:10 Peter Kota

Y he creado el alcance del modelo.

Para saber más sobre esto, scopesconsulte 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();
ManojKiran avatar Apr 09 '2019 05:04 ManojKiran

Otra opción si tu campo es datetimeen 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();
tomloprod avatar Oct 17 '2016 16:10 tomloprod

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();
Nur Uddin avatar Nov 19 '2018 06:11 Nur Uddin