php mysql laravel laravel-5 eloquent

php - Grupo elocuente Haga "SQLSTATE[42000]" con una consulta SQL válida en Laravel 5.3



mysql laravel-5 (2)

Enfrenté el mismo problema con laravel 5.3. Están tratando de imponer una escritura de consulta estricta que vino con mysql-5.7

Sin embargo, para deshabilitar esto, simplemente vaya a config/database.php y cambie strict bandera strict

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

Espero que esto también resuelva tu problema.

PD: para obtener detalles sobre la escritura estricta de consultas, consulte la respuesta de @ Shadow

Tengo un extraño problema con Eloquent que estoy tratando de hacer lo siguiente:

$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 informa un error:

QueryException en Connection.php línea 761: SQLSTATE [42000]: Error de sintaxis o violación de acceso: 1055 ''permission.id'' no está en GROUP BY (SQL: seleccione permission . id , object . name como object_name , permission . created_at , object . id como object_id del permission object unión interna en object . id = permission . object_id action unión interna en action . id = permission . action_id donde permission . person_id = 1 grupo por permission . object_id orden por permission . created_at desc limit 5 offset 0)

He agregado una función de depuración elocuente DB :: listen en 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 }); } ...

Y sí imprime esta consulta 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

Lo cual es válido en MySQL a través de PhpMyAdmin y aquí está el resultado de la consulta: Aun así, probé directamente en el comando mysql y funciona bien, mira la salida de mysql :

¿Alguna idea?

Gracias


Esta consulta está en contra del estándar sql y solo es válida en mysql bajo ciertas configuraciones de modo sql. Consulte la documentación de mysql sobre el manejo de MySQL de GROUP BY :

SQL92 y versiones anteriores no permiten consultas para las cuales la lista de selección, la condición HAVING o la lista ORDER BY hacen referencia a columnas no agregadas que no se nombran en la cláusula GROUP BY ni dependen funcionalmente de (columnas determinadas por GROUP BY). Por ejemplo, esta consulta es ilegal en SQL92 estándar porque la columna de nombre no agregado en la lista de selección no aparece en GROUP BY:

SELECCIONE o.custid, c.name, MAX (o.payment) DE los pedidos AS o, clientes AS c DONDE o.custid = c.custid GROUP BY o.custid; Para que la consulta sea legal en SQL92, la columna de nombre debe omitirse de la lista de selección o nombrarse en la cláusula GROUP BY.

SQL99 y versiones posteriores permiten dichos agregados no agregados por característica opcional T301 si dependen funcionalmente de las columnas GROUP BY: si existe una relación entre nombre y custid, la consulta es legal. Este sería el caso, por ejemplo, si fuera una clave principal de los clientes.

Debe deshabilitar el modo only_full_group_by sql (también forma parte del modo sql estricto) o usar la función any_value() en la lista de selección para campos no agregados que no están en el grupo por cláusula.

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