2015-06-19 3 views
0

Я работаю над чат-приложением, в котором я использовал Pusher для чата в реальном времени, тем временем сохраняя каждое сообщение в моей БД тоже.Как сортировать объединенные коллекции в Laravel 5?

Сообщения схема таблицы выглядит так:

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; 
} 

В основном я выборки на все сообщения, в которых текущий пользователь является либо отправитель или получатель, и наоборот для другого пользователь, id которого я поставляю с переднего конца в chatUserId.

Я использовал метод merge для объединения этой коллекции, и я пытаюсь запустить методы sortBy или sortByDesc, но они, похоже, не работают.

У меня есть простой манекен чат с парой пользователей следующим образом:

Simple chat

Веб-сервис на [email protected] возвращает это:

{ 
    "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?

ответ

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

Отлично. Работает на меня. Вы забыли «использовать ($ data)» в обратном вызове. Спасибо. :) – Rohan

+0

Ой, мой плохой. Если вам действительно нужно использовать сортировку, я уверен, что мне пришлось обмануть ее, чтобы она работала. Я проведу дома и прошу прокомментировать это через несколько часов. – zeratulmdq

Смежные вопросы