首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel雄辩地将两个结果和排序合并在一起

Laravel雄辩地将两个结果和排序合并在一起
EN

Stack Overflow用户
提问于 2019-09-12 14:07:34
回答 3查看 511关注 0票数 0

我已经找到了很多关于这个问题的帖子,但是没有解决的办法。

也许是因为我的拉拉版本。是5.7。

我有两个结果,如下所示:

代码语言:javascript
复制
result_a = DB::connection('mysql_live')->table('user_chatmessages')
->where('from_user', $data->chat_from_user)->get();

$result_b = DB::connection('mysql_live')->table('user_chatmessages')
->where('to_user', $data->chat_from_user)->get();

现在我把它们合并起来,这样做很好:

代码语言:javascript
复制
$merged = $result_a->merge($result_b);
$result = $merged->values()->sortByDesc('date_added');

排序不影响整个结果。问题是排序首先对result_a 排序,然后对 result_b**.**排序。

我尝试了大量不同的语法变体:

代码语言:javascript
复制
$result = $result_a->merge($result_b)->sortBy('date_added');

$merged = $result_a->merge($result_b);
$result = $merged->sortByDesc('date_added');

$merged = $result_a->merge($result_b)->sortByDesc('date_added');
$result = $merged->all();

$result = ($result_a->merge($result_b))->sortBy('date_added');

也许更多的是,我已经在这个问题上坐了很长时间,我发现所有的线程,它看起来非常简单,人们告诉它工作。

我还尝试用同样的结果按ID进行排序。

编辑

如果您希望获得某个用户的所有接收和发送消息,则@N69S提供的替代解决方案适用于这种情况。

但是,如何使用相同的方法在两个特定用户之间获取消息呢?例如,我希望获得ID为1的用户和ID为2的用户之间的聊天消息,这将无法工作:

代码语言:javascript
复制
$result = DB::connection('mysql_live')
                    ->table('user_chatmessages')
                    ->where('from_user', $data->chat_from_user)
                    ->where('to_user', $data->chat_to_user)
                    ->orWhere('from_user', $data->chat_to_user)
                    ->orWhere('to_user', $data->chat_from_user)
                    ->orderBy('date_added', 'desc')
                    ->get();

我现在所尝试的是这样的:

代码语言:javascript
复制
$result = DB::connection('mysql_live')->table('user_chatmessages')
    ->where(function ($query) use ($from, $to) {
        $query->where('from_user', $from)->where('to_user', $to);
    })->orWhere(function ($query) {
        $query->where('from_user', $to)->where('to_user', $from);
    })->orderBy('date_added', 'asc')->get();

但是我得到了一个错误: from & to是未定义的。

这是非常有效的:

代码语言:javascript
复制
$result = DB::connection('mysql_live')->table('user_chatmessages')
        ->where(function ($query) {
            $query->where('from_user', '1')->where('to_user', '2');
        })->orWhere(function ($query) {
            $query->where('from_user', '2')->where('to_user', '1');
        })->orderBy('date_added', 'asc')->get();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-12 14:10:03

为什么不在一个查询中恢复所有的结果?

代码语言:javascript
复制
result_a = DB::connection('mysql_live')
    ->table('user_chatmessages')
    ->where('from_user', $data->chat_from_user)
    ->orWhere('to_user', $data->chat_from_user)
    ->orderBy('date_added', 'desc')
    ->get();

如果您有默认的时间戳字段,则为->orderBy('created_at', 'desc')

编辑

为了恢复两个特定用户之间的聊天,您需要使用括号。

代码语言:javascript
复制
result_a = DB::connection('mysql_live')
    ->table('user_chatmessages')
    ->where(function($query) use($data) {
        $query->where('from_user', $data->chat_from_user)
            ->where('to_user', $data->chat_to_user);
    })
    ->orWhere(function($query) use($data) {
        $query->where('to_user', $data->chat_from_user)
            ->where('from_user', $data->chat_to_user);
    })
    ->orderBy('date_added', 'desc')
    ->get();
票数 2
EN

Stack Overflow用户

发布于 2019-09-12 14:19:05

您可以直接获得数据,而无需像这样使用合并:

代码语言:javascript
复制
result = DB::connection('mysql_live')
         ->table('user_chatmessages')
         ->where(function($query) use ($data){
           $query->where('from_user', $data->chat_from_user)->orWhere('to_user', $data->chat_from_user)
         })->orderBy('date_added','desc')
           ->get();
票数 0
EN

Stack Overflow用户

发布于 2019-09-12 15:14:12

如果要使用两个查询,那么可以使用union。

子查询

代码语言:javascript
复制
$subQuery = DB::connection('mysql_live')
->table('user_chatmessages')
->where('from_user', $data->chat_from_user);

在主查询上使用并添加子查询

代码语言:javascript
复制
$results = DB::connection('mysql_live')
->table('user_chatmessages')
->where('to_user', $data->chat_from_user)
->union($subQuery)                         //see
->orderBy('date_added', 'desc')            //see
->get();

这应该能行。您可以使用任何查询,只需将它们合并,以避免合并到集合中,然后按date_added排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57908531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档