Я пытаюсь создать страницу поста с комментариями; однако, это не работает, когда я добавляю комментарий к сообщению, потому что система не распознает идентификатор сообщения. Что я делаю неправильно, что не знает, что post_id равен $ post_id
Я получаю следующую ошибку:
SQLSTATE [HY000]: общая ошибка: 1364 Поле ‘post_id’ не имеет значения по умолчанию (SQL: вставить в
comments
(body
,updated_at
,created_at
) значений (Это тестовый комментарий, 2017-08-15 19:51:47, 2017-08-15 19:51:47))
ФОРМА КОММЕНТАРИЙ
<div class="well">
<h4>Leave a Comment:</h4>
<form role="form" method="post" action="{{ $post->id }}/comments">
{{ csrf_field() }}
<div class="form-group">
<textarea name="body" class="form-control" rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
ROUTE
Route::post('/posts/{post}/comments', 'CommentController@store');
КОНТРОЛЛЕР
public function store(Post $post)
{
$post->addComment(request('body'));
return back();
}
КОММЕНТАРИЙ МОДЕЛЬ
class Comment extends Model
{
protected $fillable = ['body'];
public function post()
{
return $this->belongsTo(Post::class);
}
}
ПОСТ МОДЕЛЬ
class Post extends Model
{
public function addComment($body)
{
Comment::create([
'body' => $body,
'post_id' => $this->id
]);
}
public function comments()
{
return $this->hasMany(Comment::class);
}
}
post_id
не в массиве
class Comment extends Model
{
protected $fillable = ['body', 'post_id']; //<---
...
}
в вашей таблице в MySQL убедитесь, что ваш post_id имеет автоматическое приращение или может быть «ноль». Эта ошибка говорит, что post_id не имеет значения и не может быть значением по умолчанию.
Судя по вашему коду, post_id является вашим первичным ключом, но не установлен на автоматическое увеличение
Я вижу, ваша функция контроллера не знает, о чем вы говорите. Вам нужно использовать идентификатор сообщения, который возвращается из вашей формы, и найти сообщение, после чего вы можете сохранить новый комментарий следующим образом.
$comment = new App\Comment(['message' => 'A new comment.']);
$post = App\Post::find(1);
$post->comments()->save($comment);
Как показано в Laravel Docs 5.4 Eloquent это заполнит идентификатор для вас.
Также, если я правильно помню, вам не нужно добавлять [‘post_id’] в ваш массив полей, которые можно заполнить.
Ошибка SQL может быть устранена с помощью «модификатора столбца». (увидеть ниже)
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});