Удаление вложенных комментариев и связанных данных из контроллера laravel

Я реализовал вложенные комментарии в laravel с помощью parent_id, и есть еще одна таблица голосов, в которой хранятся связанные данные.

У меня есть отношение hasMany, определенное в модели комментариев. Теперь, когда я удаляю комментарий, он также должен удалить все его ответы и голоса.

Для удаления голосов я использовал

$review->votes()->delete(); 

который отлично работает. но я застрял с удалением голосов за вложенные ответы.

Если я использую цикл foreach, как зацикливаться на всех уровнях, которые являются динамическими.

public function deletereview($id=null){

    $review = Review::find($id);

    foreach($review->replies as $reply){
        $reply->votes()->delete();
        //how to do this for all levels?
        $reply = $reply->votes(); // this doesn't work
    }
    return back();
}

Пожалуйста, посоветуйте, как правильно это сделать.

Примечание. Я прочитал параметры каскада из миграций, но это ничего не объясняет для вложенных комментариев (ответ на ответы и связанные с ним данные).

Спасибо -Вижай

Afaik, когда вы удаляете comment и имеете каскадные отношения для его ответов и голосов, он также должен удалить их. Есть ли у вас каскадные отношения для ответов и голосов на ваши комментарии? Пожалуйста, покажите нам связанные миграции.

Stefan Teunissen 08.04.2019 09:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
1
613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы рекомендовал использовать наблюдателя для этого.

https://laravel.com/docs/5.8/eloquent#observers

public function deleted(Review $review)
{
    foreach($review->replies as $reply){
    $votes = $reply->votes;
    Votes::destroy($votes)
}

Метод Destroy позволяет удалить несколько моделей. В этом случае для любого следующего уровня вы должны использовать другой цикл foreach.

$ответ = $ответ->голоса(); не работает, так как вы должны использовать

$votes = $reply->votes;
//or
$votes = $reply->votes()->get();
Ответ принят как подходящий
// Review Model
public function deleteRelatedData() {

  // Delete all votes of this review
  $this->votes()->delete();

  // Calling the same method to all of the child of this review
  $this->replies->each->deleteRelatedData();
}

// Controller
public function deletereview($id=null){
    $review = Review::find($id);
    $review->deleteRelatedData();
    return back();
}

Спасибо за ваши ответы, ребята, но я решил это, уменьшив уровень ответа до уровня 1, что означает, что нужен только один цикл foreach. Но до этого я следовал тому же методу, что и ваш, и также решил проблему.

Vijay 09.04.2019 13:20

Другие вопросы по теме