Удаление вложенных комментариев и связанных данных из контроллера laravel - PullRequest
0 голосов
/ 08 апреля 2019

я реализовал вложенные комментарии в 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();
}

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

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

Спасибо -Vijay

Ответы [ 2 ]

1 голос
/ 08 апреля 2019
// 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();
}
0 голосов
/ 08 апреля 2019

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

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

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

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

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

$votes = $reply->votes;
//or
$votes = $reply->votes()->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...