Как я могу решить несовместимый с 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
Ответ 9
Чтобы выбрать только агрегированные столбцы, используйте один из необработанных методов, предоставленных Laravel. Например:
Product::selectRaw('store_id')
->where('status', 1)
->groupBy('store_id')
->get();
Ответ 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',
]
],