2017-04-11 17 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