2017-01-03 224 views
0

實現Eloquent模型默認值的正確方法是什麼?

我已經使用Laravel的遷移配置了我的數據庫表。某些列具有指定的默認值。將這些表與Eloquent模型結合使用時,根據所選的數據庫驅動程序會發生不同的事情:

在MySQL中,創建新模型並保存時,會插入一個DB行,該行具有列的每個屬性的默認值沒有明確說明。 這就是我想要發生的事情。

但是,在Postgres和SQLite中並非如此。引發PDOException:

[PDOException]
SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "some_column" violates not-null constraint
DETAIL: Failing row contains (1, 2, 3, 4, 5, 6, null, null, null, null, null, null, 7, 8, null, 9, null, null, 10, 11, 12, null).

我很清楚該列不可空,且不接受空值。然而,我期望插入默認值而不是引發錯誤。

+0

哪些數據類型是您的遷移中的變量? – lewis4u

+0

@ lewis4u它是一個'tinyInteger'。 –

回答

0

SQL NOT NULL約束

NOT NULL約束強制一列不接受NULL值。

你在NOT NULL列添加空值

似乎

http://www.w3schools.com/sql/sql_notnull.asp

+0

好的,有趣的是看到這在MySQL中有效。儘管如此,問題仍然是在Eloquent中實現默認值的正確方法。 –

1

我建議你創建直接延伸雄辯自己的父模型,並把所有的車型擴展此自定義父級。

在自定義父級中,重寫performInsert()方法以在插入之前刪除null值。請務必將整個方法從雄辯複製源代碼,這樣你就不會失去在這個過程中任何重要的步驟:

class MyModelParent extends Illuminate\Database\Eloquent\Model 
{ 
    /** 
    * Perform a model insert operation. 
    * 
    * @param \Illuminate\Database\Eloquent\Builder $query 
    * @return bool 
    */ 
    protected function performInsert(Builder $query) 
    { 
     if ($this->fireModelEvent('creating') === false) { 
      return false; 
     } 

     ... // Be sure to copy all of it! 

     // This is the change you'll make. Before, it was just: 
     // $attributes = $this->attributes; 
     $attributes = array_filter($this->attributes, function($val){ 
      return $val !== null; 
     }); 

     ... // Be sure to copy all of it! 

     return true; 
    } 
} 

performUpdate()應該處理這個問題很好,因爲它使用getDirty()獲得字段列表,而不是直接訪問該屬性。

雖然你在做它,但你應該考慮向Laravel提交一個補丁,這個補丁可以使核心Postgres安全。

+0

謝謝你的回覆。剩下的問題是:爲Eloquent模型實現默認值的首選方式是什麼?這特別適用於布爾和「枚舉」(只是模型中定義的整數常量)。 –

+0

@TomLank。此解決方案應生成一個忽略空值的INPUT語句,從而使數據庫保留默認值。您不必擔心模型中的默認值。 – mopo922

+0

我會測試一下。 TY。 –