Je veux utiliser WhereIn et Groupby dans la même requête pour récupérer le résultat.
J'ai essayé ceci:
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();
Mais j'ai eu ce message d'erreur:
SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 'sbrtpt.loading.id' n'est pas dans GROUP BY (SQL: select * from loading where id in (14, 15, 16) group by vehicle_no)
loading
oùid
dans (14, 15, 16) group byvehicle_no
) @aynberRéponses:
Réponse courte
Dans
config\database.php
->"mysql"
tableauRéglez
'strict' => false
pour tout désactiver..... ou
Vous pouvez quitter
'strict' => true
et ajouter des modes à l'"mysql"
option dans'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' ], ]
Réponse détaillée
Vous n'aurez peut-être pas besoin de désactiver toutes les options strictes ... Veuillez consulter cette réponse à ce problème.
la source
php artisan config:cache
modes
(par exemple, l'ajout / la suppression de certains des modes spécifiés dans ce tableau, ou pire encore, le nom de l'un des modes spécifiés dans ce tableau change). Alors, je parsstrict=true
et je ne toucherai àmode
rien. Je vais plutôt mettre à jour mon code pour travailler avec un paramètre aussi strict.ThisPractice === SleepWellEveryNight
:)Il s'agit probablement d'un problème SQL_MODE . Dans votre
config/database.php
, dans la connexion, changezstrict => false
Un péché
'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, ],
la source
Sans modifier le fichier config \ database.php
Définir
'strict' => false
dans leconfig\database.php
pourrait être un problème de sécurité . Ainsi, une solution Laravel simple pourrait être d' abord appeléeget()
, puisgroupBy('vehicle_no)
:$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');
la source
Chaque fois que vous utilisez groupBy de manière éloquente, incluez toujours le nom de colonne utilisé dans la fonction groupBy dans la fonction select ().
$loadids=explode("#@*",$reciptdet->loading_id); $loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
Désactiver le mode strict dans le fichier de configuration est également une mauvaise pratique. Cela pourrait entraîner l'entrée de données corrompues dans la base de données, telles que des dates non valides, sans avertissement. Ne le faites pas sauf si c'est absolument nécessaire.
la source
Je faisais ce problème aussi , mais après avoir changé
'strict' => true
, pour'strict' => false
, l'erreur a disparu.Vous pouvez trouver ce paramètre dans:
config \ database.php
'mysql' => [ ... 'strict' => false, ... ]
la source
mise à jour
config/database.php
ensemble:
'mysql' => [ 'strict' => false, ],
au lieu de:
'mysql' => [ 'strict' => true, ],
et n'oubliez pas de vider le cache:
la source
Cette restriction a du sens car lorsque vous l'utilisez
GROUP BY
dans MySQL, elle renvoie une ligne pour chaque valeur des colonnes utilisées dansGROUP BY
. Ainsi, les valeurs des autres colonnes des lignes sélectionnées n'ont aucun sens à utiliser n'importe où. Il est donc toujours recommandé d'utiliser les meilleures pratiques et je recommanderais de ne pas désactiver le mode MySQL Strict.Les développeurs peuvent souvent avoir besoin de lignes d'une requête regroupées par la valeur d'une colonne. Ici, ils n'ont pas besoin d'une seule ligne pour les valeurs uniques des colonnes. Mais ils ont besoin de plusieurs lignes regroupées par les valeurs uniques d'une colonne particulière. Pour une raison quelconque, ils utilisent la
groupBy
méthode Query Builder de Laravel qui génère uneGROUP BY
requête MySQL et les développeurs rencontrent l'erreur ci-dessus.La solution à leur problème consiste à utiliser la
groupBy
méthode Collection à la place. Par exemple,$loadingData = DB::table('loading') ->whereIn('id', $loadIds) ->get() ->groupBy('vehicle_no');
Cela leur donnera le résultat souhaité.
la source
ajouter
\Schema::defaultStringLength(191);
à laboot
méthodeclass AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // \Schema::defaultStringLength(191); } }
la source
Vous pouvez aussi bien utiliser:
distinct ('vehicule_no')
au lieu de groupBy ('vehicle_no'), chaque scénario de cas est différent, mais en regardant votre requête, distinct pourrait être la voie à suivre puisque vous n'agrégez pas les données.
la source