Heim  >  Artikel  >  PHP-Framework  >  Über Laravel, das das MySQL-only_full_group_by-Problem löst

Über Laravel, das das MySQL-only_full_group_by-Problem löst

藏色散人
藏色散人nach vorne
2021-01-25 13:44:092985Durchsuche

Stellen Sie die Methode zur Lösung des MYSQL-Problems only_Full_group_BY vor. Ich hoffe, es wird Freunden, die es brauchen, hilfreich sein! Nach MySQL 5.7 ist only_full_group_by standardmäßig aktiviert, was zu einer strengeren SQL-Erkennung führt, die zur Meldung des folgenden Fehlers führt:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'edu.t_sounds.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Es waren viele Umwege erforderlich, um dieses Problem einzeln zu lösen gemäß der online gefundenen Methode

Lösung

Überprüfen Sie sql_mode

select @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode

Überprüfen und ändern Sie zunächst die MySQL-Konfigurationsdatei my.cnf. Es ist peinlich, dass es kein ONLY_FULL_GROUP_BY

[mysqld]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
gibt

, also lasst uns Fahren Sie fort und denken Sie an MySQL l Ja, um zwischen Serverkonfiguration und Clientkonfiguration zu unterscheiden, fügen Sie [Client] Konfiguration hinzu der gleiche Fehler

Nachdem ich erneut gesucht habe, wurde mir plötzlich das Problem der globalen Sitzung klar, d Variablen, eine ist eine globale Konfiguration, also global, die auf die ganze Welt wirkt; Eine Sitzungskonfigurationssitzung, die nur auf die aktuelle Verbindung wirkt

Könnte es sein, dass Laravel sql_mode auf die aktuelle Verbindung gesetzt hat Wenn das Laravel-Programm sql_mode

[client]sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

ausgibt, stellt sich heraus, dass das Programm eingerichtet ist.

Das erste, was mir einfällt, ist, dass die Konfiguration von MySQL immer einen strikten Modus hat Setzen Sie es auf „falsch“. Das Problem wurde reibungslos gelöst. Das kann das Problem lösen, aber im Sinne der Technologie müssen wir herausfinden, was los ist. Ich möchte es nicht direkt auf „falsch“ setzen Suchen Sie im Ordner „vendor/laravel/framework/src/ILLuminate/Database“ nach „strict“ und finden Sie direkt den Kerncode Das erste Urteil besteht darin, direkt festzustellen, ob eine Moduskonfiguration vorliegt. Wenn ja, führen Sie einfach einen

rrree

-Test durch und lösen Sie das Problem direkt. Im Sinne der Root-Suche Lesen Sie dann weiter

Wenn strict = true

, wird der fest codierte sql_mode im Programm direkt festgelegt Das Problem ist hier vollständig gelöstDie endgültige Lösung

$result = \DB::select('SELECT @@GLOBAL.sql_mode');
print_r($result);exit;
结果:
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

$result = \DB::select('SELECT @@SESSION.sql_mode');
print_r($result);exit;
结果:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    behält strict = true, fügt die Modi-Option hinzu, die Parameter darin sind die zugrunde liegende Konfiguration von Laravel, entfernt aber nur ONLY_FULL_GROUP_BY

Zusammenfassung: Nach vielen Umwegen und Mit viel Zeitaufwand wurde das Problem endlich gelöst und es war nicht nötig, irgendeine Konfiguration von MySQL zu ändern

Das obige ist der detaillierte Inhalt vonÜber Laravel, das das MySQL-only_full_group_by-Problem löst. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen