将数据从控制器传递到Laravel中的Model

时间:2017-10-16 09:30:22

标签: laravel laravel-5

我有这个评论控制器:

class CommentsController extends Controller
{
    public function store(Article $article){
        $comment = new Comment();
        $comment->user_id = auth()->id();
        $comment->comment = request('comment');
        $comment->article_id = $article->id;
        $comment->save();
        return back();
    }
}

它有效。我试图通过将该逻辑放入我的模型来使我的代码更清晰。所以我改变了这样:

class CommentsController extends Controller
{
    public function store(Article $article){
        $article->addComment(request('comment'));
        return back();
    }
}

同时,在我的评论模型中,我这样做:

class Article extends Model
{
    protected $fillable = ['title','content','user_id'];

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

    public function user(){
        return $this->belongsTo(User::class);
    }

    public function addComment($comment){
        Comment::create([
            'comment' => $comment,
            'article_id' => $this->id,
            'user_id' => auth()->id()
        ]);
    }
}

但是当我这样做时,我发现了这种错误:

"SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `comments` (`comment`, `article_id`, `updated_at`, `created_at`) values (Test comment bla bla bla..., 1, 2017-10-16 09:27:27, 2017-10-16 09:27:27)) ◀"

我似乎无法以这种方式获得user_id,那么如何通过user id以便我可以将其插入我的评论表中?感谢。

3 个答案:

答案 0 :(得分:0)

尝试

\Auth::id() 

而不是

auth()->id() 

并转到您的数据库,并将user_id默认为NULL

出现这种错误的原因是,当您添加以下代码时,laravel会保护数据库字段以进行批量分配,这会使所有字段都可填写。

protected $guarded = [];

另一种方法是在评论模型中添加user_id。在这种情况下,它只允许对数组中提到的字段进行批量分配。

 protected $fillable = [
        'user_id'
    ];

答案 1 :(得分:0)

试试这个:

Oct 13 2017

答案 2 :(得分:0)

您需要在user_id模型中将$fillable添加到Comment数组,而不是Article模型中,以使其正常工作。您的原始代码只是因为您没有在那里使用批量分配而工作。