Laravel Неверное значение даты sql_mode пусто
У меня проблема с выполнением обновления / вставки sql с помощью Laravel's Query Builder (DB
Фасад). Вставляя строку в таблицу, я получаю
QueryException: недопустимый формат даты и времени: 1292 Неверное значение даты: "0000-00-00" для столбца "FoundationDate".
Когда я копирую оператор SQL в PHPMyAdmin, он работает без проблем. Я знаю, это зависит от sql_mode
установка. Я проверил эту переменную, и строгий режим не включен! Так как же это возможно, что он работает на PHPMyAdmin, но в Laravel это не так?
Я использую Mysql 5.5.49 и Laravel 5.3.
Заранее спасибо!
2 ответа
Для Laravel 5.3 sql_mode устанавливается во время выполнения Illuminate\DatabaseConnectors\MySqlConnector@setModes
:
/**
* Set the modes for the connection.
*
* @param \PDO $connection
* @param array $config
* @return void
*/
protected function setModes(PDO $connection, array $config)
{
if (isset($config['modes'])) {
$modes = implode(',', $config['modes']);
$connection->prepare("set session sql_mode='{$modes}'")->execute();
} elseif (isset($config['strict'])) {
if ($config['strict']) {
$connection->prepare("set session sql_mode='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'")->execute();
} else {
$connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute();
}
}
}
Обратите внимание на sql_mode's NO_ZERO_DATE
устанавливается в этом методе. Sql_mode можно изменить в файле config.database.php, добавив modes
ключ к вашему соединению mysql как ниже:
'connections' => [
'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', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'modes' => [],
],
]
Ты можешь уйти modes
как пустой массив или настройте его как хотите. Больше информации здесь
Кроме того, вы можете просто установить strict => false,
Вставка Laravel DB, в отличие от eloquent, не создает для вас даты. Так как у вас есть FoundationDate
в вашей таблице тип Datetime, вы должны вручную установить его.
DB::table("users")->insert([
...
'FoundationDate' => \Carbon\Carbon::now()
]);