У меня есть странная проблема с 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
asobject_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 bypermission
.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, и вот результат для запроса: Даже Итак, я тестировал команду mysql
напрямую, и она работает очень хорошо, посмотрите на вывод mysql :
Есть идеи?
благодаря
Столкнулась с той же проблемой с 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;