Laravel 5.5 MassAssignmentException

时间:2017-10-27 06:51:36

标签: php laravel laravel-5.5

我正在关注Laravel From Scratch教程系列,我目前正在为您的文章系统创建评论系统。但是我遇到了问题,我现在还不知道错误在说什么。

错误:

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();
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:11)

此错误的说明

这是Laravel的安全功能。它旨在保护您在使用批量分配时不受形式操纵。

例如在注册表单上:当您的数据库中有is_admin列时,用户只需操作您的表单即可在服务器上将is_admin设置为true,因此在您的数据库中。此安全功能通过使用白名单来定义安全字段来防止这种情况。

如何修复

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

    // ...
}

参见&#34;质量分配&#34;在文档中: https://laravel.com/docs/5.5/eloquent#mass-assignment

答案 1 :(得分:0)

质量赋值是指您将数组发送到模型创建时,基本上在模型中设置一堆字段,而不是一个一个,就像您在此处所做的那样:

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

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{

    protected $fillable = ['body'];

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

正如文件所述:

  

您也可以使用create方法将新模型保存在单个模型中   线。插入的模型实例将从中返回给您   方法。但是,在这样做之前,您需要指定a   模型上的可填充或保护属性,与所有Eloquent模型一样   默认情况下防止质量分配。

希望这会对你有所帮助。