Laravel 实战开发知乎: 回复私信
打赏作者

eonbell

问个问题哈,repository中事务怎么用呢?

JellyBool 回复 eonbell

事务?是指数据库?

eonbell 回复 JellyBool

嗯,就是数据库

JellyBool 回复 eonbell

这个还是可以直接用的啊。 repository 只不过是包裹了一层 model 而已。

thirdriver

教主 先把知乎系列更新完吧。我感觉这个系列连贯性比较强,其他有些系列连贯性比较弱,比较零散,耦合度底。

junhuizoujh 回复 thirdriver

@JellyBool 我也觉得应该把知乎更完之后再录别的知识。

JellyBool 回复 junhuizoujh

是的,现在就是在更知乎的系列了

junhuizoujh 回复 JellyBool

ok。你做的视频确实不错。辛苦了。@JellyBool

JellyBool 回复 junhuizoujh

哈哈哈,感谢支持啊!

Psychic_role

5.4的话,头像地址要加一个/写成这样,不然路径又加上inbox了

JellyBool 回复 Psychic_role

你在数据库保存的时候加上 / 就好了啊

萧十五郎

多点编辑的快捷键时什么

JellyBool 回复 萧十五郎

看你使用的是什么编辑器吧,我这边是自定义过了,command + d

Smile雨后21

消息列表页,每个会话最新一条消息

    public function index()
    {
        $userId = user()->id;

        $msgIds = Message::selectRaw('max(id) as id')
            ->where('from_user_id', $userId)
            ->orWhere('to_user_id', $userId)
            ->groupBy('dialog_id')
            ->pluck('id')
            ->toArray();

        $messages = Message::with('toUser', 'fromUser')
            ->whereIn('id', $msgIds)
            ->get();

        return view('inbox.index', ['messages' => $messages->keyBy('to_user_id')]);
    }
乔泓恺-Jone

问一下:如果用户A和用户B 在没发生过私信沟通的前提下 用户A给用户B发送私信 这个时候的dialog_id 要按照什么规律赋值呢?

JellyBool 回复 乔泓恺-Jone

我目前个人觉得,只要保持唯一性就 OK 了吧

乔泓恺-Jone

我之前开发中用的方法是生成一个json字符串 比如{‘2’,‘6’} (小的id在前) 这样的话 在添加的时候不需要先去查询数据库
不知道这算是一个好方法不

JellyBool 回复 乔泓恺-Jone

也是可以的啊。这个借助 laravel 的话,应该很变量的!

biggerdong

/inbox/id,这样用get路由的话,只要输入id值不就可以随意看别人的私信了么

JellyBool 回复 biggerdong

嗯哼,你判断一下当前的用户是不是所属就 OK

WannaProGrammer 回复 JellyBool

教主,你这个私信功能逻辑似乎有问题。比如:对同一个人发送私信2次,这样就生成了2个dialogId,那么inbox里的那个只能显示出最新dialog的消息。正确的逻辑应该是根据from_user和to_user的id来分对话框,里面的消息根据时间排序吧。

JellyBool 回复 WannaProGrammer

我仔细看了一下,你的意思是:比如我向你发了了一个私信,然后你没查看,同时你也给我发了一个私信?这样确实是会存在两个 dialog_id 的情况。

我当时的逻辑是:在我们双方都没有私信的情况下,我们任意双方给对方发送一条私信,都会得到一个唯一的私信 dialog_id ,比如这个 dialog_id 可以是发送者的id拼接接受者的id,比如id为2的用户给id为4的用户发私信,他们的 dialog_id 就是24.然后双方的私信交流都是基于这个dialog_id 来的。

实在有 bug 的话,我后期更新视频的时候,修复一下这个 bug。

WannaProGrammer 回复 JellyBool

额 我的意思是在question/{id}这个页面点击发送按钮,执行

    public function store()
    {
        $message=$this->message->create([
            'to_user_id'=>request('user'),
            'from_user_id'=>user('api')->id,
            'body'=>request('body'),
            'dialog_id'=>time().Auth::id()
        ]);
        if($message){
            return response()->json(['status'=>true]);
        }

        return response()->json(['status'=>false]);
    }

这里每发送一次就会生成一个dialog_id。这样的话from_user和to_user都是相同的但dialogid不同,而inbox的show视图根据dialogid展示消息,其他dialogid的消息就看不见了。

JellyBool 回复 WannaProGrammer

恩,对。这个确实是。。。这个感觉改成这样就好了

$message=$this->message->create([
            'to_user_id'=>request('user'),
            'from_user_id'=>user('api')->id,
            'body'=>request('body'),
            'dialog_id'=>user('api')->id.request('user')
        ]);

你觉得呢。

WannaProGrammer 回复 JellyBool

恩 我试试。ps:教主最近在折腾ucloud那事吧 公众号都两天没跟了。看v社别人发的那个帖子,感觉负面影响还是有点小大啊,希望教主能妥善解决,让社区更繁荣。(:逃

JellyBool 回复 WannaProGrammer

恩,非常感谢理解。是的。因为这事。。。哎。

现在是让它冷却几天吧。

WannaProGrammer 回复 JellyBool

教主,你这个写法似乎有两个问题,a对b发送的dialogid和b对a发的dialogId反了。而且有种情况会重复,比如:from_user=12 to_user=2和fromUser=1 toUser=22得出来的dialogId是一样的。为了保证这个dialogId在from_user和to_user即使相反也能得到唯一dialogId。我用了个奇怪的方法。

'dialog_id'=>(user('api')->id+request('user')).(0).(user('api')->id*request('user'))

这个是根据复数里(a+b,ab),ab颠倒也能确定唯一复数而想出来的骚操作。但我无法证明这个dialogId是不是唯一的,而且这个太占int位数了。能否帮忙想个好的解决方法

JellyBool 回复 WannaProGrammer

阔以,后面我更新视频的时候,着重说一下这个

a90909de0

($data[‘from_user_id’] < data[touserid])?(data['to_user_id']) ? (data[‘from_user_id’].data[touserid]):(data['to_user_id']) : (data[‘to_user_id’].$data[‘from_user_id’]);
通过from_user_id与to_user_id的大小来生成dialog_id

liujun

正如上面所说的,dialog_id一会要唯一(在问题页面发送私信的时候,存储的是唯一值),一会又来个unique组合(本节视频),这两者太矛盾了。我觉得是一开始的表没有设计好,虽然我也不知道怎么设计,哈哈哈