Laravel eloquent 合并两个结果并排序

我发现了很多关于这个问题的帖子,但没有解决方案。


也许是因为我的 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 没有定义。

翻阅古今
浏览 372回答 3
3回答

PIPIONE

为什么不在一个查询中恢复所有结果?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();

MMMHUHU

您可以直接获取数据,而无需像这样使用合并: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();

陪伴而非守候

如果你想使用两个查询,那么你可以使用联合。子查询$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 排序
打开App,查看更多内容
随时随地看视频慕课网APP