当前位置: 首页 > 知识库问答 >
问题:

雄辩的groupBy在Laravel 5.3中使用有效的SQL查询生成“SQLSTATE[42000]”

蒋奕
2023-03-14

我对雄辩有一个奇怪的问题,我试图做到以下几点:

$this->node = \DB::table('permission')
                ->select('permission.id',
                         'object.name as object_name',
                         'permission.created_at',
                         'object.id as object_id')
                ->join('object', 'object.id', '=', 'permission.object_id')
                ->join('action', 'action.id', '=', 'permission.action_id')
                ->where('permission.person_id', $this->person['id'])
                ->groupBy('permission.object_id')
                ->orderBy('permission.created_at', 'desc')
                ->paginate(5);

Laravel Framework报告一个错误:

Connection.php第761行中的QueryException:SQLSTATE[42000]:语法错误或访问冲突:1055“permission.id”不在GROUP BY中(SQL:选择permissionidobject作为object\u namepermission创建,对象作为object\u id来自permission对象的内部连接对象对象对象id内部连接操作关于操作权限操作id其中权限人员id=1个分组人权限对象id排序人权限创建于描述限制5偏移0)

我添加了一个雄辩的调试函数DB::在AppServiceProvider中监听:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         DB::listen(function ($query) {

            echo "<pre>";
            print_r($query->sql);
            echo "</pre>";

            // $query->sql
            // $query->bindings
            // $query->time
        });
    }
    ...

它会打印此SQL查询:

select  `permission`.`id`, 
        `object`.`name` as `object_name`, 
        `permission`.`created_at`, 
        `object`.`id` as `object_id` 
from `permission` 
inner join `object` on `object`.`id` = `permission`.`object_id` 
inner join `action` on `action`.`id` = `permission`.`action_id` 
where `permission`.`person_id` = 1 
group by `permission`.`object_id` 
order by `permission`.`created_at` desc 
limit 5 offset 0

任何想法?

谢谢


共有2个答案

林俊英
2023-03-14

此查询违反sql标准,并且仅在某些sql模式设置下在mysql中有效。见mysql留档MySQL处理的GROUP BY:

SQL92和更早版本不允许select list、HAVING condition或ORDER BY list引用既不在GROUP BY子句中命名也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)的未聚合列的查询。例如,此查询在标准SQL92中是非法的,因为“选择”列表中的“未聚合名称”列未显示在“分组依据”中:

选择o.custid、c.name、订单中的最大(o.payment)作为o,客户作为c,其中o.custid=c.custid按o.custid分组;要使查询在SQL92中合法,必须从select列表中省略name列或在GROUP BY子句中命名。

SQL99和更高版本允许每个可选功能T301使用这样的非聚合,如果它们在功能上依赖于GROUP BY列:如果名称和查询之间存在这样的关系,则查询是合法的。例如,这将是客户的主键。

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
凌轶
2023-03-14

Laravel5.3也面临着同样的问题,他们试图强制执行mysql-5.7附带的严格的查询编写

然而,要禁用这只是去配置/database.php和更改严格标志

'mysql' => [
            .
            .
            .
            'strict' => false,
            //'strict' => true,
            .
            .
        ],

希望这也能解决你的问题。

PS-有关严格查询写作的详细信息,请参阅@Shaow的答案

 类似资料:
  • Laravel Eloquent的save()方法实质上是执行查询生成器的工作吗? 查询生成器: 雄辩的: 如果这是真的,那么Eloquent的也是如此吗?我正在看Laravel的官方视频教程,我看到作者在控制器中使用了雄辩的和。这就是查询生成器和雄辩的区别吗?我们可以使用雄辩的内部控制器?

  • 假设我们正在使用Laravel的查询生成器: 我正在寻找一个等效的SQL: 当我必须键入大量select和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?

  • 我工作太多mysql大视图。我不想使用雄辩模型的意见。 我创建了“ViewBalance\Support\Facades\DB”。一切都如我所愿。 但我需要为公司范围设置init()方法。 如果没有init()方法,如何使用全局作用域? 视图模型 控制器

  • 我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。

  • 我有两个模型。模型有一个(关系)。 关于模型,我有以下关系:

  • 我使用laravel雄辩到CRUD数据。我的问题是,我不知道如何使用laravel雄辩的ORM进行UNION查询。你能帮我解决我的问题吗 这是我想要在laravel雄辩或查询生成器中实现的示例查询