在[App\Post]中添加[title]到可填属性,以允许批量赋值。

71

在向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();
   

有人能解释一下为什么代码的上部分会抛出错误吗?


可能是Laravel中的“Mass Assignment”是什么意思?的重复问题。 - Walter Cejas
12个回答

118
在您的模型“Post”中,向可填充的数组添加标题,以便通过创建和批量方法进行保存。
protected $fillable = ['title'];

1
明白了!谢谢。您能具体说明哪种方法更好吗? - Muhammad Mansha
3
你可以使用 protected $guarded = []; 并使每个字段都可填充,但出于安全考虑,建议使用 $fillable 并将每个可填充的字段插入到其中。 - Walter Cejas

62

除了protected $fillable = ['title'];之外,另一种选择是:

protected $guarded = [];  

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


4
没问题,比在$fillable数组中逐个添加每个字段要容易得多。 - TiDJ
2
虽然更容易,但这会引入安全问题。有人可以修改您的表单并输入一个 id 字段,并在数据库中更新他们的 id。或者是 salary 或任何其他敏感字段。 - Sandy
数组转换为字符串时出现异常错误。 - Mohamed Raza
@MohamedRaza 这是另一种错误,与此无关。请检查您的代码。 - Armin
好的,@Armin,我明白了。 - Mohamed Raza
1
这应该是所有模型的标准默认行为。也许我会让所有的模型都继承另一个包含此行的类。 - Magmatic

17

适用于所有可填充的内容

protected $guarded = ['id']; 

10

对于批量赋值,你需要在你的模型(App\Post)中定义“可填充数组”。

因此,你的模型应该像这样:

    class Post extends Model
    {

        protected $fillable = ['title','body']; //<---- Add this line
// ... 
}

更多信息请参见: https://laravel.com/docs/5.7/eloquent#mass-assignment][1]。该文档涉及到it技术中的批量赋值问题,建议您仔细阅读并理解相关内容。

7
在您的模型Post中向可填充的数组添加标题。
protected $fillable = ['title'];

2
你好,欢迎来到 Stack Overflow。正如 tour 中所解释的那样,这个网站是一个有用问题及其答案的存储库。你的回答与 this answer 相似或者已经包含在其中,因此并没有提供新的价值或信息。请避免编写重复的答案。要么编辑你的答案以添加价值,要么将其删除;这将确保网站上的所有问题和答案都是有用的,而不是分散或重复的。 - Clément Baconnier

3

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

protected $fillable = ['title'];

1
我来晚了,但我遇到了这个问题,解决方案完全不同。
在我的 PostController 里,我检查了 auth,然后找到:
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']到fillable属性中以允许批量赋值”。

我意识到我添加了->first(),以确保我只获取一篇文章,但由于所有的slug都经过验证和确认是唯一的,所以我删除了->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,
    ]);

就像魔术一样,它可以工作。

如果有更高级的人能解释为什么它能工作,我会很感兴趣。谢谢!


1
所有Laravel模型在创建时都没有可填充的属性。
为了让它们能够接受字段数据并插入数据库,我们必须先在我们的模型中允许它们。
在您的文章模型中,添加以下行:
protected $fillable = ['title'];

0

0

防止一个字段的最佳选项

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接