Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel修改采集数据_Php_Laravel_Mutators - Fatal编程技术网

Php Laravel修改采集数据

Php Laravel修改采集数据,php,laravel,mutators,Php,Laravel,Mutators,我想知道Laravel是否有任何助手来修改集合。我需要做的是使用paginate()进行查询,然后检查登录的用户ID是否与发送者或接收者匹配,并在此基础上向输出添加一个新值: $userId = Auth::guard('api')->user()->user_id; $allMessages = Conversation::join('users as sender', 'conversations.sender_id', '=', 'sender.user_id')

我想知道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);
这可能吗?

通过添加以下内容解决:

foreach ($allMessages as $message) {
        if ($message->sender_id == $userId) {
            $message->display_name = $message->receivername;
        } else {
            $message->display_name = $message->sendername;
        }
      }

为此,最好使用Collection类的内置函数。例如,
map
功能将是完美的


由于我不知道您使用的是哪一个Laravel版本,所以使用Laravel 5.2让我给您一个更智能的方法来处理这个问题(如果我正确地理解了您的问题)

您可以使用Laravel的()

在构建查询时不要使用paginate方法,而应该使用simpleget方法来获取简单集合

$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();
$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);
现在,您可以根据以下特定条件将额外的项填充到该集合中

if ($allMessages->sender_id == $userId ) {
  // add new value to collection
} else {
  // add new value to collection
}
现在使用LengthAwarePaginator将填充的集合转换为分页集合

$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();
$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
现在可用于发送响应。希望这能帮助您解决您的问题。

您当然可以使用laravel的
Lengshawarepaginator

除了集合的总计数外,您还需要传递需要在每个页面上显示的集合数据片段

$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
变量声明的有限数量的项


如果你想要下面的两段数据,然后通过“代码> APIIAdvestage”页面=“2”<代码>作为你的URL。

你也可以考虑通过这个方法。它会更好,因为它不返回一个新的集合实例,但是修改了原来的集合。在构建我的查询时,我不应该使用PAGILATE吗?它不起作用,“总数”:22,“PypPage”。:20,“from”:1,“to”:22,它应该将结果限制为20,但我仍然从result@user2636197paginate()方法返回类型为\illumb\Contracts\Pagination\LengthAwarePaginator的结果,您不能使用某些收集方法来处理结果数据。这就是为什么为了使数据处理更容易,我采用了Laravel收集的形式,而不是LengthAwarePaginator。