Laravel Выборка после leftJoin

darkthor

Новичок
Всем привет. Столкнулся с сложным запросом.
PHP:
$rows = static::query()
    ->leftJoin('obligation_objects', function ($join) {
        $join->on('obligation_objects.object_id', 'lands.id')
            ->where('obligation_objects.object_type', static::class);
    })
    ->leftJoin('obligations', 'obligations.id', 'obligation_objects.obligation_id')
    ->where('obligations.egrp', '!=', true); // Тут не работает видимо
    ->select('lands.id as id')
    ->groupBy('lands.id')
    ->get();
Все это происходит в постгресе.
Не спрашивайте про связи, структура БД точно правильная, просто не буду углубляться с нюансы проекта.
Нужно выбрать те записи, у которых obligations.egrp не true (но только если в obligations вообще есть запись). Мое условие не работает, может быть потому что постгрес игнорит условие из-за того, что не было слияния.
Может быть можно как-то решить проблему без добавления других запросов и без проверки в PHP? Не хочется тянуть лишние записи.
 

darkthor

Новичок
Решил вопрос вложенным запросом:

PHP:
$rows = static::query()
    ->whereNotIn('lands.id', function (Builder $query) {
        $query->select(['obligation_objects.object_id'])
            ->from('obligation_objects')
            ->where('obligation_objects.object_type', static::class)
            ->leftJoin('obligations', 'obligations.id', 'obligation_objects.obligation_id')
            ->where('obligations.egrp', true);
    })
    ->select('lands.id as id')
    ->get();
Запрос на самом деле имеет дополнительные условия в выборке, но я оставил только то, что имеет отношение к вопросу.
Может кому-то поможет.
 

AmdY

Пью пиво
Команда форума
А почему вы не используете eloquent вместо этого ада в котором как видите легко допустить ошибку не говоря о читабельности?
 

darkthor

Новичок
А почему вы не используете eloquent вместо этого ада в котором как видите легко допустить ошибку не говоря о читабельности?
Потому что eloquent делает несколько запросов и вся операция выполняется катострофически долго в очень большой БД (для обычного сайта я конечно же не стал бы так заморачиваться). Разница в производительности не просто ощутима -- она колоссальная. Здесь может быть не так это очевидно, потому что половину запроса я удалил, т.к. она не имеет отношения к проблеме. Да даже в таком запросе уже разница была бы большой. Приходится жертвовать удобством программиста ради производительности.

Есть еще ситуация когда такой "ад" незаменим -- если вы выводите таблицу на странице, в которой столбцы могут браться из разных связанных сущностей в БД. И при этом вам нужна сортировка по таким полям. В итоге такая реализация в разы проще, компактнее и опять же работает намного быстрее.
 
Сверху