Laravel: Error de sintaxis o violación de acceso: Error 1055

89

Quiero usar WhereIn y Groupby en la misma consulta para obtener el resultado.

He probado esto:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();

Pero recibí este mensaje de error:

SQLSTATE [42000]: Error de sintaxis o infracción de acceso: 1055 'sbrtpt.loading.id' no está en GROUP BY (SQL: seleccione * from loading donde id en (14, 15, 16) group by vehicle_no)

Karthikvijayaveni
fuente
Cambie su grupo por y dóndeEn declaraciones alrededor
aynber
No funciona @aynber
Karthikvijayaveni
¿Puede imprimir su mensaje de error completo?
2016
SQLSTATE [42000]: Error de sintaxis o violación de acceso: 1055 'sbrtpt.loading.id' no está en GROUP BY (SQL: seleccione * desde loadingdónde iden (14, 15, 16) grupo por vehicle_no) @aynber
Karthikvijayaveni

Respuestas:

199

Respuesta corta

En config\database.php-> "mysql"matriz

Establecer 'strict' => falsepara deshabilitar todo.

.... o

Puede salir 'strict' => truey agregar modos a la "mysql"opción en

'mysql' => [
       ...
       ....
       'strict' => true,
       'modes' => [
            //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_AUTO_CREATE_USER',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]

Respuesta detallada

Es posible que no necesite deshabilitar todas las opciones estrictas ... Por favor, eche un vistazo a esta respuesta sobre este problema.

Husam
fuente
2
Gracias por una gran solución. este problema mató mis 3 horas
Sarower Jahan
¿Cómo podemos establecer este modo estricto en falso en la conexión de Oracle en laravel? Por favor ayúdame
Vikas Chauhan
@VikasChauhan, Lo siento, no usé Oracle antes
Husam
2
Esto funcionó !!! Para cualquiera que siga recibiendo el mismo error después de cambiar esa configuración, intente borrar la caché de configuración ejecutandophp artisan config:cache
Altin
Mi preocupación por este tipo de solución temporal codificada es que siento algún tipo de deuda técnica que no me hará dormir bien por la noche, porque el tipo de preguntas que estarán flotando en mi cabeza serán como: ¿qué pasa cuando Laravel y / o la especificación de MySQL cambia con el modes(por ejemplo, la adición / eliminación de algunos de los modos especificados en esa matriz, o peor aún, el nombre de uno de los modos especificados en esa matriz cambia). Entonces, me strict=truevoy y no toco modenada. Prefiero actualizar mi código para que funcione con una configuración tan estricta. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere
105

Probablemente sea un problema SQL_MODE . En tu config/database.php, en la conexión, cambia

strict => false

Como en

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],
Antonio Carlos Ribeiro
fuente
1
En este Método puede hacer cualquier problema de seguridad @Antonio Carlos Ribeiro
Karthikvijayaveni
Creo que es seguro o no tendrías una opción en Laravel para deshabilitarlo.
Antonio Carlos Ribeiro
7

Sin modificar el archivo config \ database.php

Establecer'strict' => false en el config\database.phppodría ser un problema de seguridad . Entonces, una solución simple de Laravel podría ser la primera llamada get()y luegogroupBy('vehicle_no) :

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
cespon
fuente
No pude obtener el resultado adecuado cuando 'estricto' => falso. entonces esta solución funciona bien si prueba datos de grupo cuando consulta. Gracias por la respuesta.
ireshan pathirana
6

Siempre que use groupBy en elocuente, incluya siempre el nombre de la columna usada en la función groupBy en la función select ().

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')

También es una mala práctica desactivar el modo estricto en el archivo de configuración. Si lo hace, puede provocar la entrada de datos corruptos en la base de datos, como fechas no válidas, sin advertencias. No lo haga a menos que sea absolutamente necesario.

Thungdemo
fuente
La adición de -> select ('columna') funcionó para mí. Gracias amigo :)
Shaan
5

Estaba teniendo este problema también, pero después de cambiar 'strict' => true, a 'strict' => false, desapareció el error.

Puede encontrar esta configuración en:

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
Zakhele
fuente
¿Cómo podemos hacer eso para la conexión de oráculo en laravel?
Vikas Chauhan
3

actualizar config/database.php

conjunto:

'mysql' => [
           'strict' => false,
        ],

en vez de:

'mysql' => [
           'strict' => true,
        ],

y no te olvides de borrar la caché:

php artisan config:cache
Gouda Elalfy
fuente
además de recibir una respuesta en 2016, si puedo votarte mil veces lo haré. golpeando con él alrededor de 24 horas sin ninguna pista de que está almacenado en caché. Te amo hombre <3
Faisal Mehmood Awan
2

Esta restricción tiene sentido, ya que cuando se utiliza GROUP BYen MySQL, devuelve una fila por cada valor en las columnas utilizadas en GROUP BY. Por lo tanto, los valores de otras columnas en las filas seleccionadas no tienen sentido para usar en cualquier lugar. Por lo tanto, siempre se recomienda utilizar las mejores prácticas y recomendaría no deshabilitar el modo estricto de MySQL.

A menudo, los desarrolladores pueden necesitar filas de una consulta agrupadas por el valor de una columna. Aquí no necesitan solo una fila por los valores únicos de las columnas. Pero necesitan varias filas agrupadas por los valores únicos de una columna en particular. Por alguna razón, usan el groupBymétodo Query Builder de Laravel que genera una GROUP BYconsulta MySQL y los desarrolladores encuentran el error anterior.

La solución a su problema es utilizar el groupBymétodo Collection en su lugar. Por ejemplo,

$loadingData = DB::table('loading')
    ->whereIn('id', $loadIds)
    ->get()
    ->groupBy('vehicle_no');

Esto les dará el resultado deseado.

Debiprasad
fuente
0

agregar \Schema::defaultStringLength(191);al bootmétodo

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         \Schema::defaultStringLength(191);
    }
}
hamed hossani
fuente
0

También podrías usar:

distinto ('vehicle_no')

en lugar de groupBy ('vehicle_no') cada escenario de caso es diferente, pero al mirar su consulta, el camino a seguir puede ser distinto, ya que no está agregando datos.

ben.c
fuente