2017-01-18 17 views
1

Laravelのクエリビルダ(DBファサード)を使用してSQLの更新/挿入を実行する際に問題があります。無効な日時書式:1292誤った日付値:テーブルに行を挿入するとき、私はLaravel不正な日付の値sql_modeが空です

QueryException得る 「0000-00-00」列の「をFoundationDate」。

SQL文をPHPMyAdminにコピーすると、問題なく動作します。私はそれがsql_mode設定に依存することを知っています。私はこの変数をチェックし、厳密なモードは有効になっていません! PHPMyAdminではどのように動作しますが、Laravelではこれがどのように動作するのでしょうか?

私はMysql 5.5.49とLaravel 5.3を使用しています。

ありがとうございます!

+0

変数をチェックしなかったを設定することができますか?値は現在のセッションに設定することができ、適切なフレームワークは常にそれを行う必要があります。何と言っても、無効な日付が最初に起こるのを防ぐのは面倒ではないと思います。 –

+0

PhpMyAdminでは、変数値(タブ "変数")をチェックすることができます。変数sql_modeは空です。 – Yannici

+0

PhpMyAdminはLaravelアプリケーションの一部ではないため、独自のデータベース接続を確立します。 PHP自体から値を確認する必要があります。 –

答えて

1

。 sql_modeのは、以下のようなMySQLの接続にmodesキーを追加してconfig.database.phpファイルで変更することができます。

'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を残すか、あなたが望むどのようにそれを設定することができます。詳細情報here

はまた、あなただけのstrict => false,

+0

'strict => false、'は方法です。ありがとうございます。 – Zariweya

0

Laravel DBの挿入は、雄弁と異なり、あなたのための日付を作成しません。テーブルのFoundationDateはDatetimeタイプであるため、手動で設定する必要があります。

/** 
* 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のNO_ZERO_DATEは、そのメソッドに設定されている:Laravel 5.3 sql_modeのがIlluminate\DatabaseConnectors\[email protected]により、実行時に設定されているために

DB::table("users")->insert([ 
    ... 
    'FoundationDate' => \Carbon\Carbon::now() 
]); 
+0

私は値 '0000-00-00'を持っています。これは別のソースから来て、後でデータベースで '0000-00-00'になるはずです。 – Yannici

+0

まあ、 '0000-00-00'は正しい日時文字列ではありません。ですから、laravelはデフォルトでそれを挿入しません。モデルに 'protected $ timestamps = false;'を追加することができます – EddyTheDove

+0

列の型は 'date'です。このタイプの場合、厳密なモードが無効である限り、正しい日付 - 値です。 PHPMyAdminはそれを受け入れ、Laravelだけが例外をスローします(実際にはmysqlから来ます)。 – Yannici