【问题标题】:Add [title] to fillable property to allow mass assignment on [App\Post]将 [title] 添加到可填充属性以允许在 [App\Post] 上进行批量分配
【发布时间】:2019-05-16 13:23:17
【问题描述】:

在Mysql中插入数据时遇到如下错误:

“将 [title] 添加到可填充属性以允许在 [App\Post] 上进行批量分配。”

这是我的代码:

$post = Post::create([
'title' => $request->input('title'),
'body' => $request->input('body')
]);

当我使用另一种方式插入数据时,它工作正常: 以下代码工作正常:

//Create Post
$post = new Post;
$post->title = $request->input('title');
$post->body = $request->input('body');
$post->save();
   

谁能解释为什么代码的上半部分会抛出错误?

【问题讨论】:

标签: php laravel


【解决方案1】:

为模型 Post 中的可填充数组添加标题,以允许通过创建和海量方法进行保存

protected $fillable = ['title'];

【讨论】:

  • 知道了!谢谢。您能否具体说明哪种方法更好?
  • 或者你可以使用 protected $guarded = [];并使每个字段都可以填写,出于安全原因购买,建议使用 $fillable 并在那里插入每个可填写的字段
【解决方案2】:

protected $fillable = ['title']; 的替代方案是:

protected $guarded = [];  

并将其保留为空数组,无需在内部定义任何内容。 它与$fillable 完全相反,有点像告诉数据库接受所有内容,除了您在$guarded 数组中指定的字段。

【讨论】:

  • 是的,比在 $fillable 数组中添加每个字段要容易得多。
  • 虽然更容易,但这会带来安全问题。有人可以修改您的表单并输入id 字段,然后更新他们在数据库中的 ID。或salary 或任何其他敏感字段。
  • 数组到字符串转换异常错误
  • @MohamedRaza 这是另一种错误,与此无关。检查你的代码。
  • 这应该是所有模型的标准默认行为。也许我会让我所有的模型都扩展另一个包含这一行的类。
【解决方案3】:

对于 $fillable all

protected $guarded = ['id']; 

【讨论】:

    【解决方案4】:

    对于批量分配,您应该在模型中定义“可填充数组”(App\Post)

    所以你的模型应该是这样的:

        class Post extends Model
        {
    
            protected $fillable = ['title','body']; //<---- Add this line
    // ... 
    }
    

    更多信息: [https://laravel.com/docs/5.7/eloquent#mass-assignment][1]

    【讨论】:

      【解决方案5】:

      出现此错误是因为您没有在模型中声明变量 - 您应该像这样在类中定义它;

      protected $fillable = ['title'];
      

      【讨论】:

        【解决方案6】:

        为模型 Post 中的可填充数组添加标题。

        protected $fillable = ['title'];
        

        【讨论】:

        • 嗨,欢迎来到 Stack Overflow。正如tour 中所述,该站点是有用问题及其答案的存储库。您的答案是(包含在)/(非常类似于)this answer,并且不是很有用,因为它不会添加任何新的价值或信息。请避免写重复的答案。编辑您的答案以增加价值或完全删除它;这将确保网站上的所有问题和答案都是有用的,不会分散/重复。
        【解决方案7】:

        在您的 Post 模型中,将有一个 $fillable 数组变量,您必须添加“标题”。

        欲了解更多信息:What does "Mass Assignment" mean in Laravel?

        【讨论】:

          【解决方案8】:

          所有 Laravel 模型在创建时,不包含任何可填充的属性。

          为了让它们接受字段数据并插入数据库,我们必须首先在我们的模型中允许它们。

          在您的 Post 模型中,添加以下行:

          protected $fillable = ['title'];
          

          【讨论】:

            【解决方案9】:

            防止一个字段的最佳选择

            Post::create($request->except('_token'));
            

            【讨论】:

              【解决方案10】:

              我迟到了,但我遇到了这个问题,解决方案完全不同。

              在我的 PostController 中,我正在检查身份验证,然后发现:

              Post::where('slug', $oldSlug)->first()->update([
                          'image_url' => $request->image_url,
                          'slug' => $newSlug,
                          'title' => $request->title,
                          'body' => $request->body,
                          'description' => $request->description,
                          'user_id' => auth()->user()->id,
                          'catagory' => $request->catagory,
                      ]);
              

              我看着它试图理解为什么它不喜欢“image_url”,并尖叫着“将 ['image_url'] 添加到可填充属性以允许批量赋值”。

              我意识到我添加了 -&gt;first() 以确保我只收到一篇帖子,但由于所有 slug 都经过验证和验证是唯一的,所以我删除了 -&gt;first()

              Post::where('slug', $oldSlug)->update([
                      'image_url' => $request->image_url,
                      'slug' => $newSlug,
                      'title' => $request->title,
                      'body' => $request->body,
                      'description' => $request->description,
                      'user_id' => auth()->user()->id,
                      'catagory' => $request->catagory,
                  ]);
              

              就像魔术一样,它起作用了。

              如果有更高级的知识的人可以解释为什么它会起作用,我会非常有兴趣知道。谢谢!

              【讨论】:

                【解决方案11】:

                查看the docs here

                或者,您可以使用 create 方法“保存”一个新模型 使用单个 PHP 语句。插入的模型实例将是 create 方法返回给你:

                use App\Models\Flight;
                
                $flight = Flight::create([
                    'name' => 'London to Paris',
                ]);
                

                但是,在使用 create 方法之前,您需要指定 模型类上的可填充或受保护的属性。这些 属性是必需的,因为所有 Eloquent 模型都受到保护 默认情况下针对批量分配漏洞。

                【讨论】:

                  猜你喜欢
                  • 2020-05-02
                  • 2021-08-24
                  • 1970-01-01
                  • 2020-07-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多