Laravel Eloquent, где поле X или null

У меня есть таблица вроде этого:

table
- field1: tinyint
- field2: varchar (nullable)
- datefield: timestamp (nullable)

Теперь я хочу получить все записи, где field1 равен 1, field2 - null, а поле даты меньше X или null. Я уже пробовал что-то вроде этого:

$query = Model::where('field1', 1)
            ->whereNull('field2')
            ->where('datefield', '<', $date)
            ->orWhereNull('datefield');

но это не работает. Я всегда получаю каждую запись, где поле даты равно null. Неважно, что такое другие поля. Я также попытался разбить его на 2 запроса: сначала получите каждую строку, где поле даты меньше X или null, а затем (на основе этого) получает каждое поле, где field1 равно 1, а field2 - null.

Результат был тот же. Любая идея, как это сделать?

Ответы

Ответ 1

Похоже, вам нужно использовать advanced where clauses.

Учитывая, что поиск в field1 и field2 постоянный, мы оставим их как есть, но мы немного скорректируем ваш поиск в datefield.

Попробуйте следующее:

$query = Model::where('field1', 1)
    ->whereNull('field2')
    ->where(function ($query) {
        $query->where('datefield', '<', $date)
            ->orWhereNull('datefield');
    }
);

Если вам нужно отлаживать запрос и видеть, почему он не работает, он может помочь увидеть, какой SQL он фактически выполняет. Вы можете связать ->toSql() до конца своего красноречивого запроса, чтобы сгенерировать SQL.