J'ai la table comme ça
Hak::whereNull('ExpDate') ->orWhere('ExpDate', '>', '2019-09-05') ->where('UserID', 23) ->get()
Je veux sélectionner les lignes que User = 1265 et isUsed = 0 et (ExpDate> 2019-09-05 ou ExpDate = null) p >
Comment faire ces sélections en utilisant laravel éloquent?
J'ai essayé ci-dessous mais il sélectionne toutes les lignes ExpDate est plus grande que le 05/09/2019 sur le tableau. Non filtré par UserID
|----|--------|------------|--------| | id | UserID | ExpDate | isUsed | |----|--------|------------|--------| | 1 | 1265 | 2019-09-08 | 0 | |----|--------|------------|--------| | 2 | 1265 | 2019-08-28 | 0 | |----|--------|------------|--------| | 3 | 1265 | null | 0 | |----|--------|------------|--------| | 4 | 1265 | null | 1 | |----|--------|------------|--------| | 5 | 1582 | 2019-09-07 | 0 | |----|--------|------------|--------| . . . . . . . . . . . .
4 Réponses :
Vous pouvez utiliser une sous-requête pour y parvenir, je ne l'ai pas testé mais vous pouvez l'essayer.
Hak::where('UserID', 23)->where('isUsed', 0)->where(function ($q){ $q->whereNull('ExpDate') ->orWhere('ExpDate', '>', '2019-09-05'); })->get();
Cela m'aide. Merci
Je pense que j'écrirais le SQL comme suit car OU
s'optimise mal dans MySQL ..
À peu près sûr, l'exécution de requêtes parallèles entièrement prise en charge changera cela à l'avenir.
Comme ils travaillent sur cette fonctionnalité, si vous le souhaitez, vous pouvez lire MySQL 8.0.14: Une route vers l'exécution de requêtes parallèles est largement ouverte!
Le résultat SQL peut être faux car vous n'a pas fourni d'exemple de données et de résultat attendu voir Pourquoi devrais-je fournir un exemple minimal reproductible pour une requête SQL très simple? pour les fournir.
<?php $first = DB::table('your_table') ->select('your_table.*') ->where('UserID ', '=', 1) ->andWhere('isUsed ', '=', 0) ->andWhere('ExpDate ', '>', '2019-09-05') ; $second = DB::table('your_table') ->select('your_table.*') ->where('UserID ', '=', 1) ->andWhere('isUsed', '=', 0) ->whereNull('ExpDate') ->union($first) ->get(); ?>
Code Laravel
Pour vous avertir, je n'a pas programmé dans Laravel depuis un certain temps maintenant, donc ce code peut être erroné.
SELECT * FROM your_table WHERE UserID = 23 AND isUsed = 0 AND ExpDate > '2019-09-05' UNION ALL SELECT * FROM your_table WHERE UserID = 23 AND isUsed = 0 AND ExpDate IS NULL
Cela peut être déroutant en provenance de SQL, mais vous aurez besoin de deux orWhere
dans Eloquent pour y parvenir. Donc en gros:
Hak::orWhereNull('ExpDate') ->orWhere('ExpDate', '>', '2019-09-05') ->where('UserID', 23) ->get()
EDIT: Je ne l'ai pas testé, mais vous pourriez avoir besoin d'une sous-requête pour filtrer également l'ID utilisateur.
Cela obtient toutes les lignes de la table, pas le filtre UserID. Merci pour ton aide
Vous pouvez essayer ci-dessous.
Hak::where(function($query){ $query->whereNull('ExpDate')->orWhere('ExpDate', '>', '2019-09-05'); })->where(['User'=>1265, 'isUsed' => 0])->get();
Cela m'aide. Merci
Voir Pourquoi Dois-je fournir un exemple minimal reproductible pour une requête SQL très simple?