2017-01-16 10 views
0

私はLaravelで中規模の大規模システムを構築しています。それはおよそ120のテーブルを持ち、おそらく70人にCRUDを持っています。これらのCRUDSにはすべて問題があります。私は、この種のミューテータを定義する必要があり、文字列型でないNULL可能フィールド持つたび:ので、もしフロントエンドにフォームフィールドが必要とされていないので、タイプエラーを避けるためにnull可能なフィールドのミューテータを定義する必要があります

public function setCollectionIdAttribute($value) 
{ 
    $this->attributes['collection_id'] = $value ?: null; 
} 

public function setCompletedAtAttribute($value) 
{ 
    $this->attributes['completed_at'] = $value ?: null; 
} 

は、私はこれをしなければなりませんユーザーがフィールドを埋めることはありません。バックエンドが受け取る値は空の文字列なので、これをデータベースに保存しようとするとエラーがスローされるので、上記の関数は値をチェックしてnullに設定します。

Laravelはこれを行うためのより良い方法を提供しますか?なぜなら、文字列型ではないnull可能なフィールドがあるたびに、これらの関数を定義する必要があるため、たくさんのフォームがあり、クールではないからです。

+0

はい、これはMySQL(またはLaravelでサポートされている他のデータベース)で呼び出されます。 – Kyslik

+0

デフォルト値では問題は解決しません。問題は、Laravelが空文字列( "")を文字列以外のフィールドに挿入しようとしていることです。 null可能フィールドを定義するたびに、デフォルトにnullが設定されます。 – Alan

+0

私はあなたの苦労を見て、MySQLでデフォルト値を使用し、空の文字列があればそのような属性を配列から削除するようにリクエストデータを変更します。 – Kyslik

答えて

0

私はこの問題をよく知っており、これまで何度も遭遇しました。ほとんどのプロジェクトでは、モデルに適用するNullableの特性を作成します。この特性は、$nullableプロパティを探し、その配列で定義された属性をループし、それらが空ならnullにそれらの値を設定します。

trait Nullable 
{ 
    public function bootNullable() 
    { 
     static::saving(function ($model) { 
      foreach ((array) $model->nullable as $key) { 
       if (empty($model->getAttribute($key))) { 
        $model->attributes[$key] = null; 
       } 
      } 
     }); 
    } 
} 

あなたはその後、ちょうどあなたのモデルにこの特性を適用し、定義します$nullableプロパティ:

class SomeModel extends Model 
{ 
    use Nullable; 

    protected $nullable = [ 
     'foo', 
     'bar', 
     'baz', 
    ]; 
} 
+0

兄さん、この問題の原因を教えてください。私はこの問題に直面していません。 – aimme

+0

それは問題ではありません、あなたが解決しなければならないコーダとしてのエッジケース。 – Kyslik

関連する問題