2016-09-28 2 views
0

Интересно, есть ли у Laravel помощник для изменения коллекции. Что мне нужно сделать, это сделать запрос с постраничным(), а затем проверить, если зарегистрированные пользователь ID сопрягать отправитель или приемник и на основе этого добавить новое значение к выходу:Laravel Изменить данные коллекции

$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

https://laravel.com/docs/5.3/collections#method-map – ceejayoz

ответ

1

решаемые путем добавления:

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

Вы лучше использовать встроенные функции класса коллекции для этого. Например, функция 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; 
}); 
+0

Вы также можете рассмотреть возможность сделать это через [accessor] (https://laravel.com/docs/5.3/eloquent-mutators). – ceejayoz

0

Как я не знаю, какая версия Laravel вы используете, принимая Laravel 5,2 позвольте мне дать вам более разумный способ справиться с этим (если я получаю вашу проблему правильно).

Вы можете использовать Laravel's LengthAwarePaginatior (API Docs).

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

+0

По какой причине я не должен использовать paginate при создании моего запроса? – user2636197

+0

Это не работает, "всего": 22, "per_page": 20, "от": 1, "к": 22, Он должен ограничить результат до 20, но я все еще получаю 22 назад от result – user2636197

+0

@ user2636197 метод paginate() возвращает результат типа \ Illuminate \ Contracts \ Pagination \ LengthAwarePaginator, на который вы не можете использовать некоторые методы сбора данных для обработки приведенных данных. Вот почему для упрощения обработки данных я принял результат, это форма коллекции Laravel вместо LengthAwarePaginator. –

Смежные вопросы