wake-up-neo.com

Wie löse ich inkompatibel mit sql_mode = only_full_group_by in Laro eloquent?

Mein Laravel-Eloquent ist so:

$products = Product::where('status', 1)
            ->where('stock', '>', 0)
            ->where('category_id', '=', $category_id)
            ->groupBy('store_id')
            ->orderBy('updated_at', 'desc')
            ->take(4)
            ->get();

Bei der Ausführung gibt es einen Fehler wie folgt:

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1055 Ausdruck # 1 Die SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält nicht aggregierte Spalte 'myshop.products.id', die funktional nicht von .__ abhängig ist. Spalten in der GROUP BY-Klausel; Dies ist nicht kompatibel mit sql_mode = only_full_group_by (SQL: Wählen Sie * aus products aus, wobei status = 1 und stock> 0 und category_id = 5 Gruppe nach store_id Reihenfolge nach updated_at absteigendes Limit 4)

Wie kann ich es lösen?

6
samuel toh

Ich hatte ein ähnliches Problem und löste es, indem der strikte Modus von mysql in der Datenbankverbindung deaktiviert wurde.

'connections' => [
    'mysql' => [
        // Behave like MySQL 5.6
        'strict' => false,

        // Behave like MySQL 5.7
        'strict' => true,
    ]
]

Noch mehr Konfigurationseinstellungen finden Sie in diesem Blogbeitrag von Matt Stauffer

25
naabster

Dies liegt daran, dass die neuesten Versionen von MySQL sich wie die meisten dbms bezüglich group by-Klauseln verhalten. Die allgemeine Regel lautet

wenn Sie group by verwenden, müssen alle Spalten in Ihrer select entweder im group by vorhanden sein oder von einer Aggregationsfunktion (sum, count, avg usw.) aggregiert sein.

Ihre aktuelle Abfrage wird nach store_id gruppiert. Da Sie jedoch alles auswählen, wird die obige Regel nicht beachtet.

4
Stefano Zanini

In der ADD-Variablen .env file: DB_STRICT=false.

Und REPLACE in Datei von der Position: config/database.php , nächste Codes 'strict' => true ON 'strict' => (env('DB_STRICT', 'true') === 'true' ? true : false).

viel Glück. 

4
amiron

Stellen Sie im Ordner config => database.php sicher, dass mysql strictfalse ist

'mysql' => [
    'driver' => 'mysql',
    'Host' => env('DB_Host', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_general_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],

wenn "strict" wahr ist, machen Sie "false", und löschen Sie "config cash", indem Sie diesen Befehl in cmd ausführen 

pHP Handwerker Config: klar

3
AnasSafi
 #Have the following method in your helper file
if (!function_exists('set_sql_mode')) {
/**
 * @param string $mode
 * @return bool
 */
function set_sql_mode($mode = '')
{
    return \DB::statement("SET SQL_MODE=''");
}
}

Rufen Sie dann set_sql_mode ('') auf; kurz vor Beredsamkeit/Abfrage

1
Godfrey Makori

einstellen

'strict' => false

in deiner config/database.php Datei. In Array connections => mysql =>

in meinem Fall verwende ich mysql 5.7 Laravel 5.7

1

Ich habe dieses Problem durch Hinzufügen der Option "Modes" gelöst und nur die Modi festgelegt, die in config => database.php aktiviert werden sollen.

'mysql' => [
    ...
    'modes' => [
        'STRICT_ALL_TABLES',
        'ERROR_FOR_DIVISION_BY_ZERO',
        'NO_ZERO_DATE',
        'NO_ZERO_IN_DATE',
        'NO_AUTO_CREATE_USER',
    ],
],

Weitere Details finden Sie in dieses Tutorial

1
O.Tadj

Um nur aggregierte Spalten auszuwählen, verwenden Sie eine der von Laravel bereitgestellten Rohmethoden . Zum Beispiel:

Product::selectRaw('store_id')
        ->where('status', 1)
        ->groupBy('store_id')
        ->get();
0
Yvan

Wie gesagt, setzen Sie den strikten Modus auf "false" kann Sicherheitslücken verursachen. Ich setze "sql_mode" auf "empty", bevor Abfragen ausgeführt werden, die dies erfordern. Beachten Sie, dass es sich um eine vorübergehende Änderung handelt. Sobald Ihre Verbindung geschlossen ist (durch laravel request)), werden Sie auf den ursprünglichen sql_mode = only_full_group_by (oder darüber hinaus) gesetzt.

DB :: statement ("SET sql_mode = ''");

Prost, fröhliches Programmieren ...

ps .: es ist kein laravel Fehler, wenn Sie versuchen, diese Abfrage direkt in Ihrer Datenbank auszuführen, werden Sie dasselbe Ergebnis erhalten. Diese Problemumgehung funktioniert in mysql ebenso wie die erste Anweisung und wird es auch sein eine temporäre Sitzungsänderung, nicht permanent.

0
Felipe Pena

Überprüfen Sie die Abfrage:

Product::where('status', 1)
            ->where('stock', '>', 0)
            ->where('category_id', '=', $category_id)
            ->groupBy('store_id')
            ->orderBy('updated_at', 'desc')
            ->take(4)
            ->get();

hier gruppieren Sie die Daten nach store_id und holen alle Spalten der Ergebnismenge ab, die nicht zulässig sind. Um dies zu lösen, wählen Sie entweder store_id oder Aggregatfunktion oder ändern Sie die Systemvariable sql_mode=only_full_group_by in SET sql_mode = ''.

Referenz

0
Mayank Pandeyz

Ich habe es gelöst, indem ich die Modi in der Datei config/database.php gesetzt habe.

Stellen Sie die Modi wie folgt ein:

'modes'  => [
                'STRICT_TRANS_TABLES',
                'NO_ZERO_IN_DATE',
                'NO_ZERO_DATE',
                'ERROR_FOR_DIVISION_BY_ZERO',
                'NO_ENGINE_SUBSTITUTION',
            ]

für MySQL-Treiber

'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' => true,
        'engine' => null,
        'modes'  => [
            'ONLY_FULL_GROUP_BY',
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_ENGINE_SUBSTITUTION',
        ]
    ],
0
Shashi Gharti