Laravel: ошибка синтаксиса или нарушение прав доступа: ошибка 1055


89

Я хочу использовать 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)


Переключите свою группу на утверждения GroupBy и whereIn
2016,

Не работает @aynber
Karthikvijayaveni 01

Вы можете распечатать полное сообщение об ошибке?
Айнбер 01

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 'sbrtpt.loading.id' не входит в GROUP BY (SQL: выберите * loadingоткуда idв (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

Ответы:


199

Короткий ответ

В 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'
        ],
 ]

Подробный ответ

Возможно, вам не нужно отключать все строгие параметры ... Пожалуйста, ознакомьтесь с этим ответом по этой проблеме.


2
Спасибо за отличное решение. эта проблема убила мои 3 часа
Sarower Jahan

Как мы можем установить для этого строгого режима значение false при подключении к оракулу в laravel? Пожалуйста, помогите мне
Викас Чаухан

@VikasChauhan, извини, что раньше не пользовался Oracle
Хусам

2
Это сработало !!! Для тех, кто по-прежнему получает ту же ошибку после изменения этого параметра, попробуйте очистить кеш конфигурации, запустивphp artisan config:cache
Altin

Меня беспокоит этот вид жестко запрограммированного обходного пути, потому что я чувствую некую техническую задолженность, из-за которой я не могу спать спокойно по ночам, потому что в моей голове будут возникать такие вопросы, как: что происходит, когда Laravel и / или изменения в спецификации MySQL относительно modes(например, добавление / удаление некоторых режимов, указанных в этом массиве, или, что еще хуже, изменение имени одного из режимов, указанных в этом массиве). Так что я просто ухожу strict=trueи ничего не трогаю mode. Я лучше обновлю свой код, чтобы он работал с такими строгими настройками. ThisPractice === SleepWellEveryNight:)
Дамилола Оловукере

105

Вероятно, это проблема 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,
],

1
В этом методе могут возникнуть любые проблемы с безопасностью @Antonio Carlos Ribeiro
Karthikvijayaveni

Я считаю, что это безопасно, иначе у вас не было бы возможности отключить его в Laravel.
Антонио Карлос Рибейро,

7

Без модификации файла 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');

Я не мог получить правильный результат, когда 'strict' => false. тогда это решение хорошо работает, если вы попытаетесь сгруппировать данные при запросе. Спасибо за ответ.
Айрешан патирана

6

При использовании 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')

Также плохой практикой является отключение строгого режима в файле конфигурации. Это может привести к тому, что в базу данных попадут поврежденные данные, например недействительные даты, без каких-либо предупреждений. Не делайте этого без крайней необходимости.


Добавление -> select ('column') сработало для меня. Спасибо, дружище :)
Шаан

5

У меня тоже была эта проблема, но после изменения 'strict' => trueна 'strict' => false ошибка исчезла.

Вы можете найти эту настройку в:

config \ database.php

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

Как мы можем сделать это для связи с оракулом в ларавеле
Викас Чаухан

3

Обновить config/database.php

задавать:

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

вместо того:

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

и не забудьте очистить кеш:

php artisan config:cache

Помимо того, что мне ответят в 2016 году, если я смогу проголосовать за вас тысячу раз, я буду. стучал с ним около 24 часов без каких-либо подсказок, что он кэшируется. Люблю тебя, мужчина <3
Фейсал Мехмуд Аван,

2

Это ограничение имеет смысл, так как при использовании 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');

Это даст им желаемый результат.


0

добавить \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);
    }
}

0

Вы также можете использовать:

отдельный ('автомобиль_но')

вместо groupBy ('vehicle_no') каждый сценарий случая отличается, но, глядя на ваш запрос, можно выбрать отдельный вариант, поскольку вы не собираете данные.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.