1
votes

Laravel: la comparaison des dates entre deux colonnes dans la base de données ne fonctionne pas

Nous essayons de construire une API avec notre projet. Mon problème est que lorsque j'ai besoin d'obtenir un événement spécifique qui a une colonne date_from et date_to , il obtient toujours les données même si l'événement était terminé. Je veux obtenir l'événement spécifique qui a eu lieu pour le reste des deux dates. Mon truc, c'est que lorsque le date_from et le date_to sont égaux ou plus grands que la date d'aujourd'hui, il s'affichera et une fois la date terminée, il ne le sera pas. Voici quelques-uns de mes codes.

Index

{
        "id": 1,
        "name": "Final",
        "content": "<p>Sample</p>",
        "group_id": 2,
        "event_date": "2019-09-01", 
        "date_from": "2019-09-20", //sept 20, 2019. The event started
        "date_to": "2019-10-03",//oct, 3 2019. The event end date. still gets the data even the date was not today.
        "time_from": "16:15:00",
        "time_to": "22:15:00",
        "event_place": "Room",
        "image": "",
        "school_id": 1,
        "smsnotify": 0,
        "appnotify": 1,
        "status": 1,
        "active": 1,
        "updated_by": null,
        "created_at": "2019-09-27 08:29:13",
        "updated_at": "2019-10-04 06:18:43",
        "users_id": 2,
        "groups": {
            "id": 2,
            "name": "Teachers",
            "description": "Teachers",
            "updated_by": null,
            "created_at": null,
            "updated_at": null
        }
    }

Résultat dans Postman

 public function index(Request $request)
    {
        $person = User::find(Auth::user()->id); 
        $now = Carbon::now()->toDateString();
        if(empty($person))
            return response()->json([
                'code' => '03',
                'status' => 'Invalid User'
            ], 403);
        $role = $person->role;
        if ($role == 2 || $role == 3) {
            $level = Event::active()->with(['groups'])
            ->where('school_id', '=', $person->school_id)
            ->where('group_id', '=', $role)
            ->orWhere('group_id', '=', $person)
            ->where('status', '=', 1)
            ->where('active', '=', 1)
            ->whereRaw("date_from <=  date('$now')")
            ->whereRaw("date_to >=  date('$now')")

            ->get();


            return response()->json($level);
        }


4 commentaires

-> whereRaw ("date_to> = date ('". $ now. "')")


Vous pouvez utiliser where ('date_from', '<=', date ('$ now'))


toujours obtenir les mêmes données dans le facteur, monsieur. @ZainFarooq


ne fonctionne pas monsieur. continuez à obtenir les données @jitheshjose


4 Réponses :


1
votes

Essayez ceci.

$level = Event::active()->with(['groups'])
            ->where([['school_id', '=', $person->school_id],['group_id', '=', $role],['status', '=', 1],['active', '=', 1]])
            ->orWhere('group_id', '=', $person)
            ->whereRaw("CURDATE() between date_from and date_to")
            ->get();


3 commentaires

Je reçois toujours les données, monsieur du facteur. Mais quand je fais une autre comparaison comme status = 0, cela fonctionnera. Seules les dates ne fonctionnent pas


J'ai découvert quelque chose monsieur. Si je commente le -> ouWhere ('group_id', '=', $ person) cela fonctionnera. mais que dois-je faire pour ne pas supprimer le ouWhere ?


Réponse modifiée, veuillez essayer comme ceci.



1
votes

La variable $ now , telle que vous l'avez définie, devrait déjà être le composant de date uniquement de l'horodatage actuel. Il ne devrait donc y avoir aucune raison de ne pas utiliser where() :

WHERE (group_id = $role OR group_id = $person)

Je suppose dans ma réponse que vous voulez éviter aujourd'hui. La logique pour cela est que la date est antérieure à la date d'aujourd'hui à minuit, ou demain à minuit ou après.

Outre le problème de date, votre gestion du group_id en utilisant where () et ouWhere () peuvent avoir causé des problèmes. Votre intention en SQL est la suivante:

$now = Carbon::now()->toDateString();

$level = Event::active()->with(['groups'])
    ->where('school_id', '=', $person->school_id)
    ->whereIn('group_id', [$role, $person])
    ->where('status', '=', 1)
    ->where('active', '=', 1)
    ->where('date_from', '<', $now)
    ->where('date_to', '>=', $now->addDays(1))

Notez attentivement les parenthèses. Mais, comme vous l'avez écrit, en raison de l'ordre des opérations, il peut ne pas sortir comme vous l'aviez prévu.


4 commentaires

Je reçois toujours les données, monsieur du facteur. Mais quand je fais une autre comparaison comme status = 0 cela fonctionnera. Seules les dates ne fonctionnent pas


J'ai découvert quelque chose monsieur. Si je commente le -> ouWhere ('group_id', '=', $ person) cela fonctionnera. mais que dois-je faire pour ne pas supprimer le ouWhere ?


@RonaldBustillo J'ai également remarqué cela. Vous devez utiliser whereIn ici.


Oh donc la clause orWhere est le problème monsieur? Quel est le problème avec l'utilisation de ouWhere que de whereIn ?



0
votes

Essayez

$level = Event::active()->with(['groups'])
  ->where('school_id', '=', $person->school_id)
  ->whereIn('group_id', [$person,$role])
  ->where('status', '=', 1)
  ->where('active', '=', 1)
  ->where('date_from', '<=', $now)
  ->where('date_to', '>=', $now->addDays(1))
  ->get();


3 commentaires

toujours le même monsieur


Notez que la logique WHERE ci-dessus ne correspondrait qu'aux enregistrements où les dates de début et de fin se produisent toutes les deux à minuit d'aujourd'hui.


Je dois donc ajouter $ now-> addDays (1) pour fonctionner correctement.



0
votes

Votre date carbone doit correspondre au format défini dans votre serveur de base de données

 ->where('date_from', '<', $now)

De plus, vous n'avez pas besoin de passer votre variable de date dans la fonction de date

$now = Carbon::now()->toDateString()->format('Database Format');


1 commentaires

Merci à ce sujet monsieur. Le problème est sur mon code dans la clause orWhere c'est pourquoi il continue à obtenir les données même si la comparaison de date est correcte. Voir la réponse de @Tim Biegeleisen