首页 > 解决方案 > 为什么插入新数据时出现错误?

问题描述

我正在尝试通过使用同一控制器添加一个新输入来覆盖 Voyager 视图“编辑添加视图”。
但是当我尝试添加新数据时,我遇到了这个错误。

“SQLSTATE [HY000]:一般错误:1364 字段 'Category_id' 没有默认值(SQL:插入到 `users`(`name`、`email`、`password`、`role_id`、`updated_at`、 `created_at`) 值 (ali12345, ali12345@ali12345.com, $2y$10$qrHhwTFhnjluM7heNE.WCOwSbFIVsag4GWJzunZQGSLgdcXD2r21a, 3, 2019-04-25 22:45:45, 2019-04-25 22:45:45)

我曾尝试在模型中添加可填充,但我没有解决方案。

protected $fillable = [
            'id',
            'role_id',
            'name',
            'email',
            'avatar',
            'password',
            'remember_token',
            'settings',
            'created_at',
            'updated_at',
            'Category_id'
        ];

标签: phplaravelvoyager

解决方案


首先,问题是因为您没有在表中设置Category_id的默认值。

如果您确定您的请求有Category_id字段,请确保在插入新记录时传递所有必填字段。

让我给你一些例子来说明你的情况(下面的代码块应该在你的Controller的某个地方)。另外我会给你我最喜欢的插入新记录的方法。

使用输入门面:

public function create(Request $request)
{
    $user = new User;

    $user->username = Input::get('role_id');
    $user->name = Input::get('name');
    $user->email = Input::get('email');
    $user->password = Hash::make(Input::get('password'));
    $user->Category_id = Input::get('Category_id');
    $user->save();

    return Redirect::back();
}

这是我最喜欢的方法:

public function create(Request $request)
{
    $user = new User;

    $data = $this->cleanUnfillableFields($request->all(), $user->getFillable());

    $user->create($data);

    return Redirect::back();
}

/**
* This removes/unsets fields that are not fillable from the model.
* This is the magic method where you should put in a separate class or a trait,
* so all controllers can share this method.
*
* @param array $data
* @param array $fillableFields
*
* @return array
*/
protected function cleanUnfillableFields(array $data, array $fillableFields): array
{
    foreach ($data as $key => $value) {
      if (! in_array($key, $fillableFields))
        unset($data[$key]);
    }

    return $data;
}

使用我上面的方法,只要您正确设置了可填写的字段并且您的请求中有必填字段,您就不必再麻烦地填写每个模型的属性并过滤掉不必要的字段。


推荐阅读