Уведомления Laravel 7 и AJAX: метод markAsRead() не обновляет результаты при возврате

#php #ajax #laravel #notifications #laravel-7

#php #ajax #laravel #уведомления #laravel-7

Вопрос:

Я реализую выпадающее меню с уведомлениями базы данных из 7 уведомлений Laravel. Я хочу, чтобы пользователь мог отклонить уведомление без необходимости перезагрузки страницы. Мой метод контроллера:

 public function markAsRead($id) {
  auth()->user()->unreadNotifications->where('id', $id)->markAsRead();

  $notificationArray = array();
    $user = Auth::user();
    foreach ($user->unreadNotifications as $notification) {
        $notificationArray[] = $notification;
    }

  return view("layouts/notifications_list", ["notifications" => compact("notificationArray")]);
}
 

Мой AJAX :

 $.ajax({
     method: "GET",
     url: ' {{ route('notifications.markNotificationAsRead', ['id']) }}'.replace('id', notificationId),
     cache: false,
      success: function(response) {
         $('#notifications-dropdown').empty();
         $('#notifications-dropdown').html(response);

     },
  });
 

Я получаю уже отображенные значения. Похоже, что строка auth()->user()->unreadNotifications->where('id', $id)->markAsRead(); игнорируется.
Однако, когда я обновляю страницу, список обновляется.

Комментарии:

1. Как выглядит ваш маршрут? ' {{ route('... может быть слишком много места. Как всегда, используйте вкладку DevTools / console / Network вашего браузера, чтобы убедиться, что вы не получаете ошибок / отправляете сообщение на правильный URL

2. Функция вызывается без проблем. Я использовал dd для двойной проверки. Проблема в том, что возвращаемый список является старым, как будто никаких изменений не было сделано. После перенаправления отображаются правильные результаты

3. Может быть проблема с обновлением dom. Проверьте ответ на вызов ajax на вкладке network в browser devtools или с помощью console.log(ответ) в функции success и посмотрите, содержит ли ответ запись уведомления, для которой был сделан запрос ajax

4. @Donkarnash Действительно, это проблема, с которой я сталкиваюсь. Хотя, очевидно, markAsRead() работает, он не возвращает ожидаемый результат.

5. Что произойдет, если вы попробуете $notificationsArray = $user->fresh()->unreadNotifications->all() вместо foreach . Также проверьте, существует ли запись с $ id, полученная в качестве параметра маршрута, в $notificationsArray с помощью dd()