2017-01-03 17 views
0

Eloquentモデルのデフォルト値を実装する適切な方法は何ですか?

Laravelの移行を使用してデータベーステーブルを設定しました。一部の列には、デフォルト値が指定されています。

MySQLでは、新しいモデルを作成して保存すると、そのモデルのすべての属性の列のデフォルト値を持つDB行が挿入されます。明示的に指定されていません。 これは私が起こりたいものです。

ただし、PostgresとSQLiteではそうではありません。

[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).

この列はNULL可能ではなく、NULL値は受け入れられません。しかし、私は、デフォルト値がエラーの代わりに挿入されていることを期待しています。

+0

どのデータ型が移行の変数ですか? – lewis4u

+0

@ lewis4uこれは 'tinyInteger'です。 –

答えて

0

SQL NOT NULL制約

NOT NULL制約は、NULL値を受け入れない列を強制します。

あなたはNOT NULL列にNULL値を追加している

私はあなたが直接雄弁を拡張し、独自の親モデルを作成することを示唆している、とあなたのすべてのモデルを持っているでしょう

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

+0

これはMySQLでうまくいくのが面白いです。それでも、Eloquentにデフォルト値を実装する正しい方法は何かが問題になります。 –

1

ようですこのカスタム親を拡張します。

カスタム親では、挿入する直前にnullの値を削除するには、performInsert()メソッドをオーバーライドします。それが代わりにフィールドのリストを取得するためにgetDirty()を使用しているので、細かいこの問題に対処する必要があり

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():あなたがプロセスで重要なステップを失うことはありませんので、雄弁ソースコードからメソッド全体をコピーしてください直接プロパティにアクセスする。

あなたがいる間、Laravelにパッチを提出して、Postgresの中核となるものを提出することを検討してください。

+0

お返事ありがとうございます。残る質問は、Eloquentモデルのデフォルト値を実装するための好ましい方法は何ですか?これは特にブール値と 'enum'(モデルで定義された整数定数)に適用されます。 –

+0

@TomLank。この解決策では、NULL値を無視するINPUT文を生成し、データベースにデフォルト値を処理させる必要があります。モデルのデフォルトを心配する必要はありません。 – mopo922

+0

これをテストします。 Ty。 –

関連する問題