我想知道Laravel是否有任何帮助来修改集合。
我需要做的是对paginate()
进行查询,然后检查登录的用户ID是否与发送者或接收者匹配,并在此基础上向输出添加一个新值:
$userId = Auth::guard('api')->user()->user_id;
$allMessages = Conversation::join('users as sender', 'conversations.sender_id', '=', 'sender.user_id')
->join('users as reciver', 'conversations.recipient_id', '=', 'reciver.user_id')
->where('sender_id',$userId)->orWhere('recipient_id',$userId)
->orderBy('last_updated', 'desc')
->select('subject','sender_id','recipient_id', 'sender_unread', 'recipient_unread', 'last_updated', 'reciver.username as receivername', 'sender.username as sendername')
->paginate(20);
现在我想这样做:
if ($allMessages->sender_id == $userId) {
// add new value to output
newField = $allMessages->sendername
} else {
// add new value to output
newField = $allMessages->receivername
}
然后发送添加了新值的数据
return response()->json(['messages' => $allMessages], 200);
这可能吗?
您最好使用Collection类的内置函数。例如,map
函数将是完美的。
https://laravel.com/docs/5.3/collections method-map
$allMessages = $allMessages->map(function ($message, $key) use($userId) {
if ($message->sender_id == $userId) {
$message->display_name = $message->receivername;
} else {
$message->display_name = $message->sendername;
}
return $message;
});
解决方法:
foreach ($allMessages as $message) {
if ($message->sender_id == $userId) {
$message->display_name = $message->receivername;
} else {
$message->display_name = $message->sendername;
}
}
您当然可以使用laravel的LengthAwarePaginator
。
除了集合的总数外,还需要传递需要在每个页面上显示的集合数据的切片。
$total_count = $allMessages->count();
$per_page = 2;
$current_page = request()->get('page') ?? 1;
$options = [
'path' => request()->url(),
'query' => request()->query(),
];
假设每页需要2个结果,那么首先计算偏移量
$offset = ($current_page - 1) * $per_page;
现在对集合进行切片以获取每页数据
$per_page_data = $collection->slice($offset, $per_page);
$paginated_data = new LengthAwarePaginator($per_page_data, $total_count, $per_page, $current_page, $options);
$paginated_data
将只有有限数量的项目由$per_page
变量声明。
如果你想要接下来的两个数据片然后传递api_request?page="2"
作为你的url
我不知道你使用的是哪个版本的Laravel,让我给你一个更聪明的方法来处理这个(如果我得到你的问题正确)。
你可以使用Laravel的lengthawarepagination (API文档)
在构建查询时不要使用paginate方法,而是使用简单的get方法来获取简单的集合。
$userId = Auth::guard('api')->user()->user_id;
$allMessages = Conversation::join('users as sender', 'conversations.sender_id', '=', 'sender.user_id')
->join('users as reciver', 'conversations.recipient_id', '=', 'reciver.user_id')
->where('sender_id',$userId)->orWhere('recipient_id',$userId)
->orderBy('last_updated', 'desc')
->select('subject','sender_id','recipient_id','sender_unread','recipient_unread','last_updated','reciver.username as receivername','sender.username as sendername')
->get();
现在,您可以根据特定的条件将额外的项填充到该集合中,如下所示。
if ($allMessages->sender_id == $userId ) {
// add new value to collection
} else {
// add new value to collection
}
现在使用LengthAwarePaginator,将填充的集合转换为分页的集合。
$total_count = $allMessages->count();
$limit = 20;
$current_page = request()->get('page');
$options = [
'path' => request()->url(),
'query' => request()->query(),
];
$paginated_collection = new LengthAwarePaginator($allMessages, $total_count, $limit, $current_page, $options);
变量$paginated_collection
现在可以用来作为响应发送。