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)
loading
dóndeid
en (14, 15, 16) grupo porvehicle_no
) @aynberRespuestas:
Respuesta corta
En
config\database.php
->"mysql"
matrizEstablecer
'strict' => false
para deshabilitar todo..... o
Puede salir
'strict' => true
y 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:cache
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, mestrict=true
voy y no tocomode
nada. 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 => 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, ],
fuente
Sin modificar el archivo config \ database.php
Establecer
'strict' => false
en elconfig\database.php
podrí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.php
conjunto:
'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 BY
en 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
groupBy
método Query Builder de Laravel que genera unaGROUP BY
consulta MySQL y los desarrolladores encuentran el error anterior.La solución a su problema es utilizar el
groupBy
mé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);
alboot
mé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