Поскольку ваши отношения hasMany
и belongsTo
, вам не нужно удалять комментарий через пост. Комментарий существует в виде собственной записи в собственной таблице и связывается с сообщением через post_id
, если вы придерживались соглашений об именах Laravel.
В этом случае, чтобы удалить комментарий, вам просто нужно использовать метод delete
:
public function destroy(Post $post, Comment $comment)
{
$comment->delete();
}
Если вы используете черту SoftDeletes
на модели Comment
, это просто установит deleted_at
на текущую метку времени. Если нет, он удалит запись из базы данных. Если вы используете SoftDeletes
и хотите удалить запись из таблицы (вместо просто установки deleted_at
), вы можете использовать forceDelete
(см. Постоянное удаление моделей ) :
public function destroy(Post $post, Comment $comment)
{
$comment->forceDelete();
}
Если вы хотите просто уничтожить ссылку между комментарием и публикацией, вы можете использовать метод dissociate
для объекта комментария. Это просто установит для поля post_id
значение null
и не удалит комментарий из таблицы.
public function destroy(Post $post, Comment $comment)
{
$comment->post()->dissociate();
$comment->save();
}
Если вы действительно хотите использовать связь, чтобы гарантировать, что только комментарии, относящиеся к данному сообщению, могут быть удалены, вы можете сделать это:
$post->comments()->whereKey($comment->id)->delete();
Это добавило бы дополнительный where
к запросу, гарантируя, что комментарий имеет post_id
, равный идентификатору сообщения.
Для справки: если у вас было отношение многие ко многим (belongsToMany
в обоих направлениях), вам необходимо удалить запись в сводной таблице. Для этого вы должны использовать detach
или sync
, чтобы предоставить только то, что должно остаться.