Я реализовал вложенные комментарии в 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();
}
Пожалуйста, посоветуйте, как правильно это сделать.
Примечание. Я прочитал параметры каскада из миграций, но это ничего не объясняет для вложенных комментариев (ответ на ответы и связанные с ним данные).
Спасибо -Вижай
Я бы рекомендовал использовать наблюдателя для этого.
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. Но до этого я следовал тому же методу, что и ваш, и также решил проблему.
Afaik, когда вы удаляете
comment
и имеете каскадные отношения для его ответов и голосов, он также должен удалить их. Есть ли у вас каскадные отношения для ответов и голосов на ваши комментарии? Пожалуйста, покажите нам связанные миграции.