J'ai une table comme celle-ci:
table
- field1: tinyint
- field2: varchar (nullable)
- datefield: timestamp (nullable)
Maintenant, je veux obtenir toutes les entrées où field1 est 1, field2 est null et où datefield est inférieur à X ou null. J'ai déjà essayé quelque chose comme ça:
$query = Model::where('field1', 1)
->whereNull('field2')
->where('datefield', '<', $date)
->orWhereNull('datefield');
mais ça ne fonctionne pas. Je reçois toujours chaque entrée où datefield est null. Peu importe ce que sont les autres champs. J'ai également essayé de le scinder en 2 requêtes: obtenez d'abord chaque ligne où datefield est inférieur à X ou null, puis (en fonction de celle-ci), obtenez tous les champs où field1 est 1 et field2 est null.
Le résultat était le même. Une idée comment faire ça?
Il semble que vous deviez utiliser advanced where clauses .
Étant donné que la recherche dans field1
et field2
est constante, nous les laisserons tels quels, mais nous allons ajuster votre recherche dans datefield
un peu.
Essaye ça:
$query = Model::where('field1', 1)
->whereNull('field2')
->where(function ($query) {
$query->where('datefield', '<', $date)
->orWhereNull('datefield');
}
);
Si vous avez besoin de déboguer une requête et de voir pourquoi elle ne fonctionne pas, il peut être utile de savoir quel code SQL elle exécute réellement. Vous pouvez chaîner ->toSql()
à la fin de votre requête éloquente pour générer le code SQL.
Vous pouvez fusionner deux requêtes ensemble:
$merged = $query_one->merge($query_two);