【问题标题】:Laravel 5.5 MassAssignmentExceptionLaravel 5.5 MassAssignmentException
【发布时间】:2018-04-08 17:02:56
【问题描述】:

我正在关注 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');

cmets 控制器:

<?php

namespace App\Http\Controllers;

use App\Post;

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

        return back();
    }
}

提前致谢!

【问题讨论】:

标签: php laravel laravel-5.5


【解决方案1】:

批量分配是当您将数组发送到模型创建时,基本上是一次性在模型上设置一堆字段,而不是像您在此处所做的那样逐个设置:

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 方法将新模型保存在单个 线。插入的模型实例将从 方法。但是,在这样做之前,您需要指定一个 与所有 Eloquent 模型一样,模型上的可填充或受保护属性 默认情况下防止批量分配。

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    这个错误的解释

    这是 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

    【讨论】:

    • 成功了,谢谢你给我详细的解释。
    猜你喜欢
    • 2018-05-09
    • 2014-04-12
    • 2017-04-14
    • 2014-05-09
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2018-04-03
    • 2018-04-12
    相关资源
    最近更新 更多