web-dev-qa-db-fra.com

Laravel Eloquent où le champ est X ou nul

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?

48
festie

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.

99
James

Vous pouvez fusionner deux requêtes ensemble:

$merged = $query_one->merge($query_two);
2
kaleazy