php - 从 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');
}
我们的类别也有一个范围查询,这样我们就可以得到所有包含至少一个模板的所有类别,该模板的维度是'digital = 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`
不包含在查询中,并且让我知道为什么它们首先被隐式添加的奖励点。
非常感谢
解决方案
我们的类别也有一个范围查询,这样我们就可以得到所有包含至少一个模板的所有类别,该模板的维度是'digital = 0'
我的建议是重写查询以使用exists
而不是join
and 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)
})
}
推荐阅读
- python - 遍历行如何提高速度
- excel - Excel VBA - 打开所有 .csv 文件并使用单元格值另存为 .xlsx
- flutter - 无论设备方向如何,如何在颤动中获取屏幕尺寸
- fortran - 模块过程的名称与包含范围单元中的名称冲突
- c++ - 将`std::string`临时传递给`std::string_view`参数是否安全?
- python - python从文本文件中获取字符串并从另一个文本文件中获取serach
- java - 二叉搜索树实现问题
- python - Django .defer() 用于从查询集中删除值
- android - Firestore user.getUsername() 返回空值
- android - Jetpack Compose 中的可组合重父化