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: виберіть * із завантаження де id у групі (14, 15, 16) за транспортним засобом)


Переключіть свою групу за заявами де і куди
aynber

Це не працює @aynber
Karthikvijayaveni

Чи можете ви роздрукувати своє повне повідомлення про помилку?
aynber

SQLSTATE [42000]: Помилка синтаксису або порушення доступу: 1055 'sbrtpt.loading.id' не знаходиться в GROUP BY (SQL: виберіть * loadingзвідки idв (14, 15, 16) групувати 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 для з’єднання oracle у laravel? Будь ласка, допоможіть мені
Вікас Чаухан

@VikasChauhan, К жаль , я не використовував Oracle до
Husam

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

Моє занепокоєння з приводу такого жорстко закодованого способу вирішення проблеми полягає в тому, що я відчуваю якусь технічну заборгованість, яка не змусить мене добре спати вночі, тому що такі запитання, які лунатимуть у мене в голові, будуть такими: що станеться, коли Ларавел і / або зміна специфікації MySQL із зміною modes(наприклад, додавання / видалення деяких режимів, зазначених у цьому масиві, або ще гірше, змінюється назва одного із режимів, зазначених у цьому масиві). Отже, я просто йду strict=trueі нічого не торкаюся mode. Я скоріше оновлю свій код для роботи з такими суворими налаштуваннями. ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

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.
Антоніо Карлос Рібейро,

8

Не змінюючи файл 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. тоді це рішення добре працює, якщо ви намагаєтесь групувати дані під час запиту. Дякую за відповідь.
ireshan pathirana

6

Кожного разу, коли використовується groupBy в красномовстві, завжди включайте ім'я стовпця, яке використовується у функції 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 ('стовпець') спрацювало у мене. Дякую приятелю :)
Шан

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
Faisal Mehmood Awan

2

Це обмеження має сенс, оскільки при використанні GROUP BYв MySQL воно повертає один рядок для кожного значення в стовпцях, що використовуються вGROUP BY . Отже, значення інших стовпців у вибраних рядках не має сенсу використовувати де-небудь. Отже, завжди рекомендується використовувати найкращі практики, і я б рекомендував не вимикати строгий режим MySQL.

Часто розробникам можуть знадобитися рядки запиту, згруповані за значенням стовпця. Тут їм не потрібен лише один рядок на унікальні значення стовпців. Але їм потрібні кілька рядків, згруповані за унікальними значеннями певного стовпця. З якоїсь причини вони використовують groupByметод побудови запитів 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.