laravel - 插入相关型号: "Field doesn' t have a default value"

标签 laravel laravel-5 laravel-5.4

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. 为什么这会引发指向字符的 SQL 错误?
  2. 这是一种很好的保存方法,还是我应该让所有内容都可填充并使用 create?

最佳答案

$fillable 属性不仅影响 create() 方法,还会影响任何使用 fill() 方法的内容。当您通过构造函数将属性传递给新实例时,这也会在幕后使用 fill() 方法。因此,所有这些值也都受到 $fillable 属性的影响。因此,如果 character 不在 $fillable 数组中,您显示的代码将引发错误。

很难说什么是“好”方法,因为所有方法在安全性和可用性方面都有不同的权衡。如果您的模型完全不 protected ,则代码很容易编写,但更容易引入安全问题。如果您的模型受到完全保护,则代码必须更加冗长,但不太容易出现安全问题。这完全取决于您对什么感到满意。

重要的是了解框架如何工作,这样您就可以了解这些权衡并确定什么对您和您的应用程序“有利”。

就个人而言,除非情况另有规定,否则我倾向于使除主键和外键之外的所有字段都可填写。保护可填写字段的责任就落到了处理输入的地方(例如 Controller 操作)。

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
}

关于laravel - 插入相关型号: "Field doesn' t have a default value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43350339/

相关文章:

php - 找不到 Laravel 5 View

php - 何时在 Laravel 中使用双大括号?

php - 比较 laravel 5 blade 中的字符串

laravel-5.4 - 使用 Queue 发送邮件但 Laravel 5.4 似乎没有响应

php - 重命名一个表是另一个表中的外键

php - 如何在foreach Laravel中渲染FK值

php - Laravel Spark 无法正确引入 css

php - Laravel 邮件 : How to pass ->attachData to view

laravel - 如何在 Laravel 上的电子邮件布局中显示图像?

laravel - 监听回调在 Pusher API Laravel 5.4 中不起作用