2017-04-11 7 views
2

characterフィールドがフォームで満たされる「フィールドは、デフォルト値を持っていない」(DD()を証明している)が、このエラーは、最大表示されます。挿入関連モデル:

一般エラー:

1364 Field 'character' doesn't have a default value (SQL: insert into `characters` (`name`, `user_id`, `updated_at`, `created_at`) 

保存するか、作成しますか?

ユーザーに関連する別のモデルを保存しようとしています。フォームデータと内部データがあります。だから、私はちょうど作成方法を使うことができないのですよね?誰もこれらの値のいくつかを操作することはできません。

public function store() 
{ 
    // validation 

    $character = new Character([ 
     'user_id' => auth()->id(), 
     'character' => request('character'), 
     'name' => request('name'), 
     'level' => 1, 
     'experience' => 0, 
     'health' => 500, 
     'primary' => 'test', 
     'secondary' => 'test', 
    ]); 
    $user = auth()->user(); 
    $user->characters()->save($character); 

    // redirect 
} 

私の二つの主要な質問:

  1. は、なぜこれがcharacterを指すSQLエラーを投げるでしょうか?
  2. これは良い保存方法ですか、それともすべてをfillableにしてcreateを使用する必要がありますか?

答えて

1

$fillableプロパティは、create()メソッドに影響するだけではなく、fill()メソッドを使用するものに影響します。コンストラクタを使用して新しいインスタンスに属性を渡す場合、これはまた、舞台裏でfill()メソッドを使用します。したがって、これらの値はすべて$fillableプロパティの影響を受けます。したがって、character$fillable配列にない場合、表示されたコードはエラーをスローします。

すべてのアプローチがセキュリティとユーザビリティに関して異なるトレードオフを持つため、「良い」アプローチが何であるかは言うまでもありません。モデルが完全に保護されていないと、コードを書くのが簡単になりますが、セキュリティ問題を導入する方が簡単です。モデルが完全に保護されている場合、コードははるかに冗長である必要がありますが、セキュリティ上の問題が起きにくくなります。それはあなたが快適であるかどうかによって異なります。

重要なことは、フレームワークの仕組みを知っていることで、これらのトレードオフを理解し、あなたとあなたのアプリケーションにとって「良い」ものが何であるかを判断できることです。

状況に別様に指示がない限り、プライマリキーと外部キーを除いてすべてのフィールドを塗りつぶす傾向があります。充填可能フィールドを保護する責任は、入力が処理される場所(例えば、コントローラアクション)に落ちる。

public function store() 
{ 
    // validation 

    // make sure to only accept "character" and "name" input from the user. 
    // all other fields are defaulted. 
    // note: foreign key user_id has been removed 
    // note: all these fields must be fillable or else they will be skipped 
    $data = array_merge(
     $request->only(['character', 'name']), 
     [ 
      'level' => 1, 
      'experience' => 0, 
      'health' => 500, 
      'primary' => 'test', 
      'secondary' => 'test', 
     ] 
    ); 

    // create a new instance with the given data; does not touch the db yet. 
    $character = new Character($data); 

    $user = auth()->user(); 

    // assigns the foreign key field then saves record to the database. 
    $user->characters()->save($character); 

    // redirect 
} 
+1

うわー、それは私には新しいです。私はいつも塗りつぶしに悩まされる方が安全だと思っていますが、それは必要です。くそー。私のメンター!いいライドをしてください。 – Bensen

1

おそらくrequest('character')nullを返します。したがって、この列を->nullable()にするか、デフォルト値として->default('a')などを追加する必要があります。

そして、可能な限りcreate()などの方法を使用することが常に良い方法です。

+0

文字はラジオリストから選択してください。デフォルト以外の値にすることはできません。私のコードで何が間違っているの男:D – Bensen

関連する問題