У меня есть запрос области в проекте 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`
не включены в запрос, и бонусный балл за то, что я знаю, почему они неявно добавлены в первую очередь.
Огромное спасибо






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, которые были разработаны для решения одной проблемы, для решения другой проблемы, с которой они, как оказалось, работают.