为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel eloquent 合并两个结果并排序

Laravel eloquent 合并两个结果并排序

PHP
翻阅古今 2022-01-08 17:22:45
我发现了很多关于这个问题的帖子,但没有解决方案。也许是因为我的 laravel 版本。它的 5.7。我有两个结果,如下所示: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();现在我合并它们,效果很好:$merged = $result_a->merge($result_b);$result = $merged->values()->sortByDesc('date_added');排序不会影响整个结果。问题是排序先排序result_a,然后排序result_b。我尝试了很多不同的语法变体:$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 的用户之间的聊天消息,这将不起作用:$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();我现在正在尝试的看起来像这样:$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 没有定义。
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

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


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')如果您有默认时间戳字段


编辑


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


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();


查看完整回答
反对 回复 2022-01-08
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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


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();


查看完整回答
反对 回复 2022-01-08
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

如果你想使用两个查询,那么你可以使用联合。


子查询


$subQuery = DB::connection('mysql_live')

->table('user_chatmessages')

->where('from_user', $data->chat_from_user);

在主查询上使用联合添加子查询


$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_add 排序


查看完整回答
反对 回复 2022-01-08
  • 3 回答
  • 0 关注
  • 371 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信