从Laravel范围查询中排除联接列ONLY_FULL_GROUP_BY错误

时间:2019-07-18 12:40:18

标签: php mysql database laravel eloquent

我在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`

不包含在查询中,还有加分,让我知道为什么将它们隐式添加到首位。

非常感谢

1 个答案:

答案 0 :(得分:1)

  

我们的类别还具有范围查询,因此我们可以获得包含至少一个尺寸为'digital = 0'的模板的所有类别

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