【问题标题】:Laravel eloquent merge two results and sortLaravel eloquent 合并两个结果并排序
【发布时间】:2019-09-13 17:01:40
【问题描述】:

我找到了大量关于这个问题的帖子,但没有任何解决方案。

可能是因为我的 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。

这很好用:

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

【问题讨论】:

标签: php laravel sorting eloquent


【解决方案1】:

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

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

【讨论】:

  • 因为它会获取所有结果并且不会缩小 from_user 的范围,特别是如果您想在两个特定用户之间进行聊天。
  • @Roman 不确定你的意思,但这个答案正是你想要的,只是以一种更高效的方式。
  • 我同意这适用于本示例,但如果我想在 ID 为 1 的用户和 ID 为 2 的用户之间进行特定聊天,它将不起作用。至少在我尝试这种方法时它不起作用(也许我犯了一个错误)。我仍然很好奇为什么合并在这里不起作用。我不能接受,因为这不是问题的答案。
  • @Roman 介意在您的问题中提出无效的示例?
  • @N69S Ofc。我会尽快进行编辑
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    子查询

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

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2014-05-29
      • 2017-10-05
      • 1970-01-01
      • 2015-09-17
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多