如何对 Laravel 5 中的合并集合进行排序?
How to sort merged collections in Laravel 5?
我正在开发一个聊天应用程序,我在其中使用 Pusher 进行实时聊天,同时也将每条消息存储在我的数据库中。
消息 table 架构如下所示:
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。
我已经使用合并方法来合并这些集合,我正在尝试 运行 sortBy
或 sortByDesc
方法,但它们似乎不起作用。
我与几个用户进行了简单的虚拟聊天,如下所示:
Web 服务位于 MessageController@index
returns 这个:
{
"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"
}
}
这显然不是我想要的排序方式。如何按 created_at
字段对 Laravel 中的合并集合进行排序?
如果您不需要在两个不同的集合中发送和接收的消息,您可以这样做:
$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();
我正在开发一个聊天应用程序,我在其中使用 Pusher 进行实时聊天,同时也将每条消息存储在我的数据库中。
消息 table 架构如下所示:
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。
我已经使用合并方法来合并这些集合,我正在尝试 运行 sortBy
或 sortByDesc
方法,但它们似乎不起作用。
我与几个用户进行了简单的虚拟聊天,如下所示:
Web 服务位于 MessageController@index
returns 这个:
{
"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"
}
}
这显然不是我想要的排序方式。如何按 created_at
字段对 Laravel 中的合并集合进行排序?
如果您不需要在两个不同的集合中发送和接收的消息,您可以这样做:
$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();