使用 Observer 每个事件要等待 4 秒钟?还是我的操作有误?(已解决)!

attendances表 主要五个字段
created_at 上班签到时间;
updated_at 下班签到时间
sip 上班签到IP
eip 下班签到IP
ctime 是统计时长;例如(8小时53分钟55秒);
逻辑:用户点击下班签到 会自动计算出 上班签到时间-下班签到时间 =ctime时间;
问题:每次点击下班签到需要等待大约4秒钟
控制器逻辑

 //上班签到
    public function store(Request $request)
    {
        $request->user()->attendances()->create([      
            'sip' => $request->getClientIp(), //上班签到IP
        ]);
        return redirect()->back()->with('success', '上班签到');
    }

    //下班签到
    public function update(Request $request, Attendance $attendance)
    {
        $attendance->update([     
            'eip' => $request->getClientIp(), //下班签到IP
        ]);
        return redirect()->back()->with('success', '下班签到');
    }

App/Providers/AppServiceProvider.php

   public function boot()
    {
        //注册观察者
        Attendance::observe(AttendanceObserver::class);
    }

Observers/AttendanceObserver.php

  public function updated(Attendance $attendance)
    {
        //维护时间
        $one = strtotime($attendance->created_at);
        $two = strtotime($attendance->updated_at);
        $three = $two - $one;
        $h = floor(($three%(3600*24))/3600);
        $m = floor(($three%(3600*24))%3600/60);
        $s = floor(($three%(3600*24))%60);
        $four = $h . '小时' . $m . '分钟' . $s . '秒'  ;
        $attendance->ctime = $four;
        $attendance->save();
    }

遇到问题查看文档以及教程后发现,不能在Observer里面使用CRM;要用DB查询构造器,避免循环问题;
修改后

 public function updated(Attendance $attendance)
    {
        //维护时间
        $one = strtotime($attendance->created_at);
        $two = strtotime($attendance->updated_at);
        $three = $two - $one;
        $h = floor(($three%(3600*24))/3600);
        $m = floor(($three%(3600*24))%3600/60);
        $s = floor(($three%(3600*24))%60);
        $four = $h . '小时' . $m . '分钟' . $s . '秒'  ;
        $last = Attendance::orderBy('created_at','desc')->first()->id;
        \DB::table('attendances')->where('id',$last)->update(['ctime' => $four]);
    }

分享此问题的目的是,当其他人遇到此问题的时候可以快速锁定问题!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5
千秋大劫

环境正常吗,不会开了虚拟机又开了ngrok吧

4年前 评论
李小明 (楼主) 4年前
千秋大劫 (作者) 4年前

按你写的代码的意图来看,其实完全没必要使用观察者,UPDATED_AT = 'ctime' 不是更合适吗?

4年前 评论

CRM字打错啦,应该是ORM

4年前 评论

为什么不用updating 或saveing 而要用updated呢?在保存前就计算好值不香么?

4年前 评论

不要试图帮助网友解决问题,因为他们的环境,代码里面有什么,网络另一端的人我们根本就不知道。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!