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()
]);
Другие вопросы по тегам