web-dev-qa-db-fra.com

Comment interroger deux dates avec Laravel et Eloquent?

J'essaie de créer une page de rapport qui affiche les rapports d'une date spécifique à une date spécifique. Voici mon code actuel:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();

Ce que cela fait en langage SQL simple est select * from table where reservation_from = $now.

J'ai cette requête ici mais je ne sais pas comment le convertir en requête éloquente.

SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to

Comment puis-je convertir le code ci-dessus en requête éloquente? Merci d'avance.

70
wobsoriano

La méthode whereBetween vérifie que la valeur d'une colonne est comprise entre deux valeurs.

$from = date('2018-01-01');
$to = date('2018-05-02');

Reservation::whereBetween('reservation_from', [$from, $to])->get();

Dans certains cas, vous devez ajouter une plage de dates de manière dynamique. Basé sur le commentaire de @ Anovative , vous pouvez le faire:

Reservation::all()->filter(function($item) {
  if (Carbon::now->between($item->from, $item->to) {
    return $item;
  }
});

Si vous souhaitez ajouter d'autres conditions, vous pouvez utiliser orWhereBetween. Si vous souhaitez exclure un intervalle de dates, vous pouvez utiliser whereNotBetween.

Reservation::whereBetween('reservation_from', [$from1, $to1])
  ->orWhereBetween('reservation_to', [$from2, $to2])
  ->whereNotBetween('reservation_to', [$from3, $to3])
  ->get();

Autres clauses utiles où: whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime, whereColumn, whereExists, whereRaw.

Laravel docs sur les clauses Where.

148
Peter Kota

Ce qui suit devrait fonctionner:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
                           ->where('reservation_from', '<=', $to)
                           ->get();
9
Pᴇʜ

Une autre option si votre champ est datetime au lieu de date (bien que cela fonctionne dans les deux cas):

$fromDate = "2016-10-01";
$toDate   = "2016-10-31";

$reservations = Reservation::whereRaw("reservation_from >= ? AND reservation_from <= ?", 
    array($fromDate." 00:00:00", $toDate." 23:59:59")
)->get();
8
tomloprod

Essaye ça:

Puisque vous effectuez une récupération basée sur une valeur de colonne unique, vous pouvez également simplifier votre requête:

$reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();

Récupérer en fonction de la condition: laravel docs

J'espère que cela a aidé.

7
ArtisanBay

Si vous voulez vérifier si la date actuelle existe entre deux dates dans la base de données: => ici, la requête obtiendra la liste des applications si la demande de l'employeur à partir de et jusqu'à ce jour existe dans la date du jour.

$list=  (new LeaveApplication())
            ->whereDate('from','<=', $today)
            ->whereDate('to','>=', $today)
            ->get();
6
John

Je sais que c'est peut-être une vieille question, mais je me suis juste retrouvé dans une situation où je devais implémenter cette fonctionnalité dans une application Laravel 5.7. Ci-dessous est ce qui a fonctionné de moi.

 $articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();

Vous devrez également utiliser Carbon

use Carbon\Carbon;
2
Excellent Lawrence

Si vous avez besoin de savoir quand un champ date/heure devrait être comme ceci.

return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();
1
MIGUEL LOPEZ

Et j'ai créé la portée du modèle

En savoir plus sur les portées:

Code:

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

Et dans le contrôleur, ajoutez la bibliothèque de carbone en haut

use Carbon\Carbon;

OU

use Illuminate\Support\Carbon;

Pour obtenir l'enregistrement des 10 derniers jours à partir de maintenant

 $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(10)->toDateString(),(new Carbon)->now()->toDateString() )->get();

Pour obtenir l'enregistrement des 30 derniers jours à partir de maintenant

 $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(30)->toDateString(),(new Carbon)->now()->toDateString() )->get();
1
Manojkiran.A