Laravel Изменить сбор данных

Интересно, есть ли у 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);

Это возможно?

0

Решение

Для этого вам лучше использовать встроенные функции класса 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;
});
3

Другие решения

Решается добавлением:

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

Поскольку я не знаю, какую версию 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 Теперь можно использовать для отправки в ответ. Надеюсь, что это поможет вам справиться с вашей проблемой.

-1
По вопросам рекламы [email protected]