Исключить столбцы соединения из запроса области действия Laravel, ошибка ONLY_FULL_GROUP_BY

У меня есть запрос области в проекте Laravel, который неявно извлекает два столбца, которые мне не нужны в наборе результатов, потому что они вызывают ошибку ONLY_FULL_GROUP_BY, я не хочу отключать это условие базы данных.

Имеем следующие отношения:

Организация имеет -> Категории

public function categories()
{
    return $this->belongsToMany(
        Category::class,
        'organisation_unit_template_categories',
        'organisation_unit_id',
        'template_category_id'
    );
}

Категории имеет -> Шаблоны

public function templates()
{
    return $this->hasMany(Template::class);
}

Шаблон имеет -> Размеры

public function dimensions()
{
    return $this->belongsTo(Dimensions::class, 'dimensions_id');
}

У наших категорий также есть запрос области, так что мы можем получить все категории, которые содержат хотя бы один шаблон, размеры которого имеют «цифровой = 0».

public function scopeIsPrint($query)
{
    return $query
        ->select($this->getTable().'.*')
        ->join('templates', 'template_categories.id', '=', 'templates.category_id')
        ->join('template_dimensions', 'template_dimensions.id', '=', 'templates.dimensions_id')
        ->where('template_dimensions.digital', 0)
        ->groupBy($this->getTable().'.id');
}

Мы вызываем запрос области от контроллера следующим образом:

$categories = $this->organisation->categories()->isPrint()->get();

Это выводит:

SELECT 
    `template_categories`.*,
    `organisation_unit_template_categories`.`organisation_unit_id` AS `pivot_organisation_unit_id`,
    `organisation_unit_template_categories`.`template_category_id` AS `pivot_template_category_id`
FROM
    `template_categories`
        INNER JOIN
    `organisation_unit_template_categories` ON `template_categories`.`id` = `organisation_unit_template_categories`.`template_category_id`
        INNER JOIN
    `templates` ON `template_categories`.`id` = `templates`.`category_id`
        INNER JOIN
    `template_dimensions` ON `template_dimensions`.`id` = `templates`.`dimensions_id`
WHERE
    `organisation_unit_template_categories`.`organisation_unit_id` = 2
        AND `template_dimensions`.`digital` = 0
        AND `template_categories`.`deleted_at` IS NULL
GROUP BY `template_categories`.`id`

Как я могу убедиться, что эти два столбца:

`organisation_unit_template_categories`.`organisation_unit_id` AS `pivot_organisation_unit_id`,
`organisation_unit_template_categories`.`template_category_id` AS `pivot_template_category_id`

не включены в запрос, и бонусный балл за то, что я знаю, почему они неявно добавлены в первую очередь.

Огромное спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
331
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Our categories also have a scope query, so that we can get all categories which contain at least one template who's dimensions have 'digital = 0'

Я предлагаю переписать запрос, чтобы использовать exists вместо join и group by.

public function scopeIsPrint($query)
{
    return $query
        ->whereExists(function($q) {
            return $q->selectRaw('1')->from('templates')
                     ->join('template_dimensions', 'template_dimensions.id', '=', 'templates.dimensions_id')
                     ->whereRaw('template_categories.id=templates.category_id')
                     ->where('template_dimensions.digital', 0)
        })
}

Спасибо за рекомендацию - это на самом деле лучше, чем то, что я делал в первую очередь. -- Использование функций MySQL, которые были разработаны для решения одной проблемы, для решения другой проблемы, с которой они, как оказалось, работают.

Adam Copley 18.07.2019 16:35

Другие вопросы по теме