Как я могу решить несовместимый с sql_mode = only_full_group_by в laravel eloquent?

Мой красноречивый laravel выглядит следующим образом:

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

При выполнении существует такая ошибка:

SQLSTATE [42000]: Ошибка синтаксиса или нарушение доступа: 1055 Выражение # 1 списка SELECT не находится в предложении GROUP BY и содержит неагрегированные column 'myshop.products.id', который функционально не зависит от столбцы в разделе GROUP BY; это несовместимо с sql_mode = only_full_group_by (SQL: select * from products где status= 1 и stock > 0 и category_id= 5 группа store_idпорядка updated_at предел desc 4)

Как я могу его решить?

Ответ 1

У меня была аналогичная проблема и она была решена, отключив строгий режим mysql в настройках подключения к базе данных.

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

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

Вы можете найти еще больше настроек конфигурации в этом сообщении в блоге Matt Stauffer

Ответ 2

В папке config => database.php убедитесь, что mysql strict имеет значение false, как это

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

если для параметра true установлено значение true, установите для него значение false, затем очистите конфигурационные деньги, выполнив эту команду в cmd

Конфигурация PHP Artisan: очистить

Ответ 3

Я решил эту проблему, добавив опцию "mode" и установив только те режимы, которые я хочу включить в config => database.php

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

Подробнее в этом уроке

Ответ 4

Это потому, что последние версии MySQL ведут себя как большинство dbms уже в отношении предложений group by; общее правило

если вы используете group by, все столбцы в select должны присутствовать в group by или агрегироваться функцией агрегации (sum, count, avg и т.д.),

Ваш текущий запрос группируется с помощью store_id, но поскольку вы выбираете все, что вышеприведенное правило не соблюдается.

Ответ 5

В файле .env ADD переменная: DB_STRICT=false.

И ЗАМЕНИТЕ в файле из местоположения: config/database.php, следующие коды 'strict' => true ON 'strict' => (env('DB_STRICT', 'true') === 'true'? true: false),

удачи.

Ответ 6

Проверьте запрос:

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

здесь вы группируете данные с помощью store_id и извлекаете все столбцы в наборе результатов, которые не разрешены. Чтобы решить эту проблему, выберите либо store_id или функцию агрегации на ней, либо измените системную переменную sql_mode=only_full_group_by на SET sql_mode = ''.

Ссылка

Ответ 7

 #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=''");
}
}

Затем вызовите set_sql_mode (''); незадолго до eloquent/запроса

Ответ 8

задавать

'strict' => false

в вашем файле config/database.php. В массиве connections => mysql =>

в моем случае я использую mysql 5.7 Laravel 5.7

Ответ 10

Как уже говорилось, установка строгого режима на false может привести к ошибкам в системе безопасности, и я пытаюсь установить sql_mode пустым перед запросами, которые этого требуют. Обратите внимание, что это ВРЕМЕННОЕ изменение, когда ваше соединение будет закрыто (по запросу laravel), вам будет присвоено значение sql_mode = only_full_group_by (или выше).

DB :: оператор ("SET sql_mode = ''");

Ура, счастливого кодирования...

PS: это не ошибка Laravel, если вы попытаетесь выполнить этот запрос непосредственно в вашей БД, вы столкнетесь с тем же результатом. Этот обходной путь работает как в mysql, так и в первом утверждении, и снова будет временным изменением сеанса, а не постоянным.

Ответ 11

Я решил это, установив режимы в файле config/database.php.

Установите режимы следующим образом:

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

для драйвера MySQL

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