2017-04-11 52 views
2

character場由製作填充(DD()證明),但這個錯誤是顯示出來:插入相關機型:「字段沒有默認值」

常規錯誤:

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

保存或創建?

我嘗試保存與用戶相關的另一個模型。有表格數據和內部數據。這就是爲什麼我不能使用create-method,對吧?沒有人應該能夠操縱這些價值中的一部分。

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. 這是一個很好的保存方法,還是應該讓所有東西都可填寫並使用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

嗯,但字符應該是從收音機列表中選擇的字符。它不能爲零或默認。男人ma代碼中有什麼不對:D – Bensen