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)

loadingdóndeiden (14, 15, 16) grupo porvehicle_no) @aynberRespuestas:
Respuesta corta
En
config\database.php->"mysql"matrizEstablecer
'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.
fuente
php artisan config:cachemodes(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, mestrict=truevoy y no tocomodenada. Prefiero actualizar mi código para que funcione con una configuración tan estricta.ThisPractice === SleepWellEveryNight:)Probablemente sea un problema SQL_MODE . En tu
config/database.php, en la conexión, cambiastrict => falseComo 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, ],fuente
Sin modificar el archivo config \ database.php
Establecer
'strict' => falseen elconfig\database.phppodría ser un problema de seguridad . Entonces, una solución simple de Laravel podría ser la primera llamadaget()y luegogroupBy('vehicle_no):$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');fuente
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.
fuente
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, ... ]fuente
actualizar
config/database.phpconjunto:
'mysql' => [ 'strict' => false, ],en vez de:
'mysql' => [ 'strict' => true, ],y no te olvides de borrar la caché:
fuente
Esta restricción tiene sentido, ya que cuando se utiliza
GROUP BYen MySQL, devuelve una fila por cada valor en las columnas utilizadas enGROUP 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 unaGROUP 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.
fuente
agregar
\Schema::defaultStringLength(191);albootmétodoclass AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // \Schema::defaultStringLength(191); } }fuente
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.
fuente