Eloquent groupBy делает «SQLSTATE » с действительным SQL-запросом в Laravel 5.3

У меня есть странная проблема с Eloquent, которую я пытаюсь сделать следующим образом:

$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 сообщает об ошибке:

QueryException в строке Connection.php 761: SQLSTATE [42000]: ошибка синтаксиса или нарушение прав доступа: 1055 «permission.id» не находится в GROUP BY (SQL: выберите permission . id , object . object_name as object_name , permission . created_at , object id как object_id из permission внутренний object соединения на object id = permission object_id action внутреннего соединения на action id = permission . action_id где permission person_id = 1 по permission . object_id order by permission . created_at desc limit 5 offset 0)

Я добавил функцию отладки Eloquent DB :: listen в 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 

Что действительно в MySQL через PhpMyAdmin, и вот результат для запроса: Вывод SQL-запроса Даже Итак, я тестировал команду mysql напрямую, и она работает очень хорошо, посмотрите на вывод mysql :

введите описание изображения здесь

Есть идеи?

благодаря

Related of "Eloquent groupBy делает «SQLSTATE » с действительным SQL-запросом в Laravel 5.3"

Столкнулась с той же проблемой с laravel 5.3. Они пытаются обеспечить строгую запись запросов с помощью mysql-5.7

Однако для отключения этого просто перейдите в config/database.php и измените strict флаг

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

Надеюсь, это тоже решит вашу проблему.

Этот запрос противоречит стандарту sql и действителен только в mysql в определенных настройках режима sql. См. Документацию mysql по обработке MySQL GROUP BY :

SQL92 и ранее не разрешают запросы, для которых список выбора, условие HAVING или ORDER BY относятся к неагрегированным столбцам, которые не являются нименованными в предложении GROUP BY, и не зависят от функциональности (уникально определены) столбцами GROUP BY. Например, этот запрос является незаконным в стандартном SQL92, поскольку столбец неагрегированных имен в списке выбора не отображается в GROUP BY:

SELECT o.custid, c.name, MAX (o.payment) FROM orders AS o, клиенты AS c WHERE o.custid = c.custid GROUP BY o.custid; Чтобы запрос был законным в SQL92, столбец имен должен быть опущен из списка выбора или назван в предложении GROUP BY.

SQL99 и более поздние версии допускают такие неагрегаты для каждой необязательной функции T301, если они функционально зависят от столбцов GROUP BY: если такая связь существует между именем и custid, запрос является законным. Например, это было бы, например, одним из основных ключей клиентов.

Вам либо нужно отключить режим only_full_group_by sql (он также является частью строгого режима sql), либо использовать функцию any_value () в списке выбора для неагрегированных полей, которые не находятся в разделе group by.

 SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;