Laravel 5.5 MassAssignmentException

4
我是一名有用的助手,可以为您翻译文本。

我正在跟随Laravel从零开始的教程系列,目前我正在为文章系统创建评论系统。但我遇到了一个问题,此时我不知道错误信息在说什么。

错误信息:

Illuminate\Database\Eloquent\MassAssignmentException
body

评论模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

帖子模型:

<?php

namespace App;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function addComment($body)
    {
        $this->comments()->create(compact('body'));
    }
}
我制定的路线:
Route::post('/posts/{post}/comments', 'CommentsController@store');

评论控制器:

<?php

namespace App\Http\Controllers;

use App\Post;

class CommentsController extends Controller
{
    public function store(Post $post)
    {
        $post->addComment(request('body'));

        return back();
    }
}

提前感谢!


请参考以下链接中的内容:https://dev59.com/_FsW5IYBdhLWcg3w0Z0j#34565540 - Moppo
3
可能是Laravel 5:Model.php中的MassAssignmentException的重复问题。 - Himanshu Upadhyay
1
在你的两个模型中添加 protected $fillable = [ 'db_column1','db_column' ] - aldrin27
2个回答

13

这个错误的解释

这是 Laravel 的一个安全特性。它旨在保护您免受使用批量赋值时的表单操作。

例如,在注册表单中:当您的数据库中有一个 is_admin 列时,用户只需操纵您的表单即可将 is_admin 设置为 true,从而在您的服务器和数据库中进行更改。这个安全特性通过使用白名单来定义安全字段,从而防止这种情况的发生。


如何修复它

您需要在您的模型上设置一个 $fillable 属性。它的值必须是一个包含所有可批量赋值的安全字段的数组(如用户名、电子邮件地址等)。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    # This property!
    protected $fillable = ['body'];

    // ...
}

请查看文档中关于“批量赋值”的部分:https://laravel.com/docs/5.5/eloquent#mass-assignment


这样做很好,感谢你给我详细的解释。 - Dion Pool

0

批量赋值是指在模型创建时发送一个数组,基本上是一次性设置模型上的一堆字段,而不是逐个设置,就像你在这里所做的那样:

public function addComment($body)
{
    $this->comments()->create(compact('body'));
}

您需要将要填充的字段添加到Comments.php模型中的fillable数组中:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{

    protected $fillable = ['body'];

    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

根据文档所述:

您还可以使用create方法在一行中保存新模型。插入的模型实例将从该方法返回给您。但是,在执行此操作之前,您需要在模型上指定fillable或guarded属性,因为所有Eloquent模型默认都会保护免受批量赋值的影响。

希望这能帮到您。

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