2015-06-21 88 views
0

我來自Rails背景,我正在玩Lavaral 5,我做了一個CartItem模型,默認情況下所有列應該是NOT NULL。但是,如果我沒有指定某些屬性,比如說:user_id,Laravel會爲我插入0,我不知道這是屬性還是錯誤,因爲此行爲會隱藏一些缺陷或錯誤。防止Laravel 5在將記錄插入到MySQL時隱式分配默認值

如果我忘記分配任何NOT NULL屬性,我期望從MySQL獲得完整性約束違規,但Laravel絕不會讓它發生。如果Laravel將缺省值插入到NOT NULL列中,那麼甚至將db列標記爲NOT NULL又有什麼意義,該框架無論如何都無法保護這個完整性。我想一定有辦法輕輕地禁用此功能,請告訴我路徑,謝謝。

更多細節:

CartItem表看起來像這樣:



    public function up() 
     { 
      Schema::create('cart_items', function(Blueprint $table) 
      { 
       $table->increments('id'); 
       $table->integer('user_id'); 
       $table->integer('product_id'); 
       $table->decimal('unit_price', 11, 2); 
       $table->integer('quantity'); 
       $table->decimal('subtotal', 11, 2); 
       $table->timestamps(); 
       $table->softDeletes(); 

       $table->index('user_id'); 
       $table->index('product_id'); 
      }); 
     } 

和廷克我可以這樣做:



    >>> \App\CartItem::create([]) 
    => { 
      updated_at: "2015-06-21 06:57:31", 
      created_at: "2015-06-21 06:57:31", 
      id: 8 
     } 

這導致在一排在我的分貝與所有NOT NULL列設置爲0或0.00,我檢查了我的分貝,所有這些列設置爲非空,默認爲None

+0

據我所知,laravel沒有指定默認值。它的數據庫分配了默認值。你重新檢查你的數據庫? – Salar

+0

切勿使用默認值。永遠 – Drew

+0

+1 @Salar,我不認爲Laravel會分配默認值。如果您嘗試在不接受空值的列中插入空值,則會引發SQL錯誤。 德魯皮爾斯你爲什麼這麼說?默認值提供了某種回退,並保護您的應用程序不會拋出錯誤/異常。 –

回答

0

最後我想通了,Laravel 5沒有將默認值賦給NOT NULL列,但默認情況下它確實關閉了'strict'模式。

下面是從配置/ database.php中的一個片段:



    'mysql' => [ 
       'driver' => 'mysql', 
       'host'  => env('DB_HOST', 'localhost'), 
       'unix_socket' => env('DB_SOCKET', ''), 
       'database' => env('DB_DATABASE', 'forge'), 
       'username' => env('DB_USERNAME', 'forge'), 
       'password' => env('DB_PASSWORD', ''), 
       'charset' => 'utf8', 
       'collation' => 'utf8_unicode_ci', 
       'prefix' => '', 
       'strict' => false, 
      ], 

通過改變'strict'形式falsetrue,我高興地看到了MySQL的拋出異常如我所料。


    [PDOException] 
    SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value 
1

很明顯,問題不在Laravel中,但很可能在MySQL配置中。

根據您的操作系統查找my.cnfmy.ini MySQL配置文件並添加STRICT_TRANS_TABLESsql-mode值。

E.g.
sql-mode=」NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION」

編輯後:編輯之前
sql-mode=」STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION」

你必須保存配置文件後重新啓動mysql和預期都將可能工作。