Я хочу использовать WhereIn и Groupby в одном запросе для получения результата.
Я пробовал это:
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();
Но я получил это сообщение об ошибке:
SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 'sbrtpt.loading.id' не входит в GROUP BY (SQL: выберите * из загрузки, где идентификатор в (14, 15, 16) группе по vehicle_no)
loading
откудаid
в (14, 15, 16) group byvehicle_no
) @aynberОтветы:
Короткий ответ
В
config\database.php
->"mysql"
массивУстановите,
'strict' => false
чтобы отключить все..... или
Вы можете оставить
'strict' => true
и добавить режимы к"mysql"
опции в'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' ], ]
Подробный ответ
Возможно, вам не нужно отключать все строгие параметры ... Пожалуйста, ознакомьтесь с этим ответом по этой проблеме.
источник
php artisan config:cache
modes
(например, добавление / удаление некоторых режимов, указанных в этом массиве, или, что еще хуже, изменение имени одного из режимов, указанных в этом массиве). Так что я просто ухожуstrict=true
и ничего не трогаюmode
. Я лучше обновлю свой код, чтобы он работал с такими строгими настройками.ThisPractice === SleepWellEveryNight
:)Вероятно, это проблема SQL_MODE . В вашем
config/database.php
, в связи, изменитеstrict => false
Как в
'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, ],
источник
Без модификации файла config \ database.php
Установка
'strict' => false
вconfig\database.php
может быть проблемой безопасности . Итак, простое решение Laravel может быть сначала вызовом,get()
а затемgroupBy('vehicle_no)
:$loadids = explode("#@*", $reciptdet->loading_id); $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get(); $grouped = $loadingdatas->groupBy('vehicle_no');
источник
При использовании groupBy в eloquent всегда включайте имя столбца, используемое в функции groupBy в функции select ().
$loadids=explode("#@*",$reciptdet->loading_id); $loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
Также плохой практикой является отключение строгого режима в файле конфигурации. Это может привести к тому, что в базу данных попадут поврежденные данные, например недействительные даты, без каких-либо предупреждений. Не делайте этого без крайней необходимости.
источник
У меня тоже была эта проблема, но после изменения
'strict' => true
на'strict' => false
ошибка исчезла.Вы можете найти эту настройку в:
config \ database.php
'mysql' => [ ... 'strict' => false, ... ]
источник
Обновить
config/database.php
задавать:
'mysql' => [ 'strict' => false, ],
вместо того:
'mysql' => [ 'strict' => true, ],
и не забудьте очистить кеш:
источник
Это ограничение имеет смысл, так как при использовании
GROUP BY
в MySQL оно возвращает одну строку для каждого значения в столбцах, используемых вGROUP BY
. Значит, значения других столбцов в выбранных строках нигде нет смысла использовать. Поэтому всегда рекомендуется использовать лучшие практики, и я бы рекомендовал не отключать MySQL Strict Mode.Часто разработчикам могут потребоваться строки запроса, сгруппированные по значению столбца. Здесь им не нужна только одна строка на уникальные значения столбцов. Но им нужно несколько строк, сгруппированных по уникальным значениям определенного столбца. По какой-то причине они используют
groupBy
метод Query Builder Laravel, который генерирует MySQLGROUP BY
запрос и разработчики сталкиваются с указанной выше ошибкой.Решение их проблемы - использовать
groupBy
вместо этого метод Collection. Например,$loadingData = DB::table('loading') ->whereIn('id', $loadIds) ->get() ->groupBy('vehicle_no');
Это даст им желаемый результат.
источник
добавить
\Schema::defaultStringLength(191);
вboot
метод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); } }
источник
Вы также можете использовать:
отдельный ('автомобиль_но')
вместо groupBy ('vehicle_no') каждый сценарий случая отличается, но, глядя на ваш запрос, можно выбрать отдельный вариант, поскольку вы не собираете данные.
источник