Интересно, есть ли у Laravel какой-нибудь помощник для изменения коллекции. Что мне нужно сделать, это сделать запрос с помощью функции paginate (), а затем проверить, соответствует ли идентификатор пользователя, вошедшего в систему, отправителю или получателю, и на основе этого добавить новое значение в вывод:
$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 вы используете, принимая Laravel 5.2, позвольте мне дать вам более умный способ справиться с этим (если я правильно понял вашу проблему).
Вы можете использовать Laravel’s LengthAwarePaginatior(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
Теперь можно использовать для отправки в ответ. Надеюсь, что это поможет вам справиться с вашей проблемой.