【问题标题】:How to sort merged collections in Laravel 5?如何在 Laravel 5 中对合并的集合进行排序?
【发布时间】:2017-02-10 16:23:53
【问题描述】:

我正在开发一个聊天应用程序,我使用 Pusher 进行实时聊天,同时将每条消息也存储在我的数据库中。

Messages 表架构如下所示:

public function up()
{
    Schema::create('messages', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('sender_id')->unsigned();
        $table->foreign('sender_id')->references('id')->on('users')->onDelete('cascade');
        $table->integer('receiver_id')->unsigned();
        $table->foreign('receiver_id')->references('id')->on('users')->onDelete('cascade');
        $table->text('body');
        $table->timestamps();
    });
}

这很简单。引用发送者和接收者的两个外键。

聊天工作正常,用户可以互相聊天。但现在我还需要用户可以看到旧消息。

我有一个MessageController,其中的索引方法如下所示:

public function index()
{
    $data = $this->request->all();

    $receivedMessages = $this->user->currentUser()->receivedMessages()
                ->where('sender_id', $data['chatUserId'])
                ->get();

    $sentMessages = $this->user->currentUser()->sentMessages()
                ->where('receiver_id', $data['chatUserId'])
                ->get();

    $messages = $receivedMessages->merge($sentMessages)->sortBy('created_at');

    return $messages;
}

基本上,我正在获取当前用户是发送者或接收者的所有消息,反之亦然,对于另一个用户,我在chatUserId 中从前端提供其ID。

我已经使用 merge 方法来合并这些集合,我正在尝试运行 sortBysortByDesc 方法,但它们似乎不起作用。

我与几个用户进行了简单的虚拟聊天,如下所示:

MessageController@index 的网络服务返回以下内容:

{
   "0":{
      "id":"10",
      "sender_id":"3",
      "receiver_id":"1",
      "body":"Hi Rohan. How are you?",
      "created_at":"2015-06-19 08:32:49",
      "updated_at":"2015-06-19 08:32:49"
   },
   "1":{
      "id":"12",
      "sender_id":"3",
      "receiver_id":"1",
      "body":"I have been good too.",
      "created_at":"2015-06-19 08:33:06",
      "updated_at":"2015-06-19 08:33:06"
   },
   "2":{
      "id":"9",
      "sender_id":"1",
      "receiver_id":"3",
      "body":"Hi Ava",
      "created_at":"2015-06-19 08:32:41",
      "updated_at":"2015-06-19 08:32:41"
   },
   "3":{
      "id":"11",
      "sender_id":"1",
      "receiver_id":"3",
      "body":"I am good Ava. How have you been?",
      "created_at":"2015-06-19 08:32:59",
      "updated_at":"2015-06-19 08:32:59"
   }
}

这显然不是我想要的排序方式。如何在 Laravel 中按created_at 字段对合并的集合进行排序?

【问题讨论】:

    标签: sorting laravel eloquent laravel-5 chat


    【解决方案1】:

    如果您不需要在两个不同的集合中发送和接收的消息,您可以执行以下操作:

    $messages = Messages::where(function ($query) {
                              $query->where('sender_id', USER_ID)
                              ->where('receiver_id', $data['chatUserId']);
                          })
                          ->orWhere(function ($query) {
                              $query->where('sender_id', $data['chatUserId'])
                              ->where('receiver_id', USER_ID);
                          })
                          ->sortBy('created_at)
                          ->get();
    

    【讨论】:

    • 优秀。为我工作。你忘了在回调中use ($data)。感谢。 :)
    • 糟糕,我的错。如果你真的需要使用排序,我很确定我必须欺骗它才能工作。我会在家里检查并在几个小时后再次发表评论。
    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2021-01-15
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多