首页 > 解决方案 > 从 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`

不包含在查询中,并且让我知道为什么它们首先被隐式添加的奖励点。

非常感谢

标签: phpmysqldatabaselaraveleloquent

解决方案


我们的类别也有一个范围查询,这样我们就可以得到所有包含至少一个模板的所有类别,该模板的维度是'digital = 0'

我的建议是重写查询以使用exists而不是joinand 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)
        })
}

推荐阅读