Удалить связанную модель правильно - PullRequest
0 голосов
/ 05 сентября 2018

Функция моего магазина

public function store(Request $request, Post $post)
{
    $comment = new Comment();
    $comment->fill($request->all());
    $post->comments()->save($comment);
}

И моя функция уничтожения

public function destroy(Post $post, Comment $comment)
{

}

Функция хранилища, полученная из документации ( Вставка и обновление связанных моделей )

Так, какова лучшая практика, чтобы удалить комментарий через модель Post?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Поскольку ваши отношения 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, чтобы предоставить только то, что должно остаться.

0 голосов
/ 05 сентября 2018

Вы можете попробовать использовать Laravel Observer, вот пример

для создания наблюдателя вы можете

php artisan make:observer PostObserver

Это создаст хороший шаблон.

class PostObserver
{

    public function deleting(Post $post){

        $comments =  $post->comments;
        $comments->delete();
    }

}

в вашем AppServiceProvider.php

Post::observe(PostObserver);

удалит соответствующие модели перед удалением сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...