laravel 你能帮我解决这个 AJAX 更新通知场景吗

pieyvz9o  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(137)
    • bounty将在4天后过期**。回答此问题可获得+50声望奖励。Pouya希望引起更多人关注此问题。

我正在用Laravel 9开发一个论坛项目,我已经使用了**database**通知来向用户显示新的通知,如 * 最佳答案 * 等。
通知列表工作正常,但是在页面刷新后显示新通知的数量,但是我需要应用ajax live update来获得实时的应用程序用户体验,所以这里是notification-header部分,它显示了新通知的数量:

<div class="header__notification-btn" data-dropdown-btn="notification">
    <i class="icon-Notification"></i>
    @if(count(auth()->user()->unreadNotifications) != 0)
        <span id="unreads">{{ digits_persian(count(auth()->user()->unreadNotifications)) }}</span>
    @endif
    <span style="display:none" id="elan"></span>
</div>

然后我尝试应用Ajax部分,如下所示:

notifcount = 0;
        $(document).ready(function() {
            setInterval(function() {
                $.ajax({
                    url: 'new-notifications-exists',
                    method: 'GET',
                    dataType: 'json',
                    success: function(response) {
                        if(notifcount == 0){
                            notifcount = response.notifcount;
                        }
                        if(response.notifcount > notifcount){
                            notifcount = response.notifcount;
                            new_notifications_found();
                        }
                    }
                });
            }, 2000);
        });
        function new_notifications_found(){
            $("#unreads").hide();
            $("#elan").show();
            $("#elan").html("+.");
        }

这是new-notifications-exists URI处理程序:

Route::get('/new-notifications-exists', 'ToolsController@count_notifz');

控制器方法:

public function count_notifz()
    {
        if(Auth::check()){
            $notiflist = DB::table('notifications')->where('notifiable_id',auth()->user()->id)->whereNull('read_at')->get();
            $notifcount = $notiflist->count();
            $response = array('notifcount' => $notifcount);
            echo json_encode($response);
        }
    }

因此:当我收到新通知时,必须显示<span style="display:none" id="elan"></span>,因为js函数new_question_found()最终隐藏#unreads并显示#elan div。
但是这个东西不工作,我在控制台得到这个错误:

"不存在模型[App\Models\Question]新通知的查询结果"**

我不知道到底出了什么问题。
因此,如果你有任何想法或知道如何应用ajax正确的这些通知,请让我知道...
我会很感激的

nsc4cvqm

nsc4cvqm1#

只需将控制器方法更改为:

public function count_notifz()
    {
        if(Auth::check()){
            $notiflist = DB::table('notifications')->where('notifiable_id',auth()->user()->id)->whereNull('read_at')->get();
            $notifcount=count(auth()->user()->unreadNotifications)
            return response()->json(['notifcount' => $notifcount]);
        }
    }

它在你的刀片上工作,然后应该在其他地方工作。

jm81lzqq

jm81lzqq2#

不确定这是否有帮助,但这发生在我身上。问题可能与路由有关。因为错误显示为NotFoundException
改变这个

Route::get('/new-notifications-exists', 'ToolsController@count_notifz');

到这个

Route::get('/new-notifications-exists', [ToolsController::class, 'count_notifz']);

在route. use App\Http\Controllers\ToolsController;中导入您的ToolsController。(id默认路径)
然后跑

PHP artisan optimize

并使用return response()->json($response);代替echo

hzbexzde

hzbexzde3#

看起来您在count_notifz()函数中使用了错误的模型。您可以使用auth()->user()->unreadNotifications()方法来检索已验证用户的未读通知,如下所示:

public function count_notifz()
{
    if (Auth::check()) {
        $notifcount = auth()->user()->unreadNotifications()->count();
        $response = array('notifcount' => $notifcount);
        return response()->json($response);
    }
}

确保更新JavaScript代码中的 AJAX URL以指向正确的路径

$.ajax({
    url: '{{ route('new-notifications-exists') }}',
    // ...
});

相关问题