1
votes

Comment obtenir la colonne est Null et conditionnée en php laravel

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 :


3
votes

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();


1 commentaires

Cela m'aide. Merci



0
votes

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


0 commentaires

-1
votes

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.


1 commentaires

Cela obtient toutes les lignes de la table, pas le filtre UserID. Merci pour ton aide



6
votes

Vous pouvez essayer ci-dessous.

Hak::where(function($query){
    $query->whereNull('ExpDate')->orWhere('ExpDate', '>', '2019-09-05');
})->where(['User'=>1265, 'isUsed' => 0])->get();


1 commentaires

Cela m'aide. Merci