Попробуйте изменить данные в pagination → item в Laravel, но не получится, как я могу это решить? - PullRequest
0 голосов
/ 02 мая 2019

Я делаю Restful API с помощью Laravel

Я пытался изменить данные в результате разбивки на страницы

Мой код

$rooms->getCollection()->transform(function ($item) {
    if (!$item->last_message) {
        $item->last_message = (object) array('updated_at' => ''.$item->updated_at);
    }
    $item->test0 = $item->id;
    $item->test1 = $item->last_message;
    $item->test2 = \json_encode($item->last_message);
    $item->test3 = \json_encode($item);
    return $item;
});

Я ожидал, что $item->last_message будет равно item->updated_at но результат всегда null

Вот результат JSON

{
  "current_page": 1,
  "data": [
    {
      "id": 33,
      "user_id": 1,
      "seller_id": 3,
      "room_id": 1,
      "market_id": 1,
      "created_at": "2019-05-02 10:23:29",
      "updated_at": "2019-05-02 10:23:29",
      "last_message": null,
      "test0": 33,
      "test1": {
        "updated_at": "2019-05-02 10:23:29"
      },
      "test2": "{\"updated_at\":\"2019-05-02 10:23:29\"}",
      "test3": "{\"id\":33,\"user_id\":1,\"seller_id\":3,\"room_id\":1,\"market_id\":1,\"created_at\":\"2019-05-02 10:23:29\",\"updated_at\":\"2019-05-02 10:23:29\",\"last_message\":null,\"test0\":33,\"test1\":{\"updated_at\":\"2019-05-02 10:23:29\"},\"test2\":\"{\\\"updated_at\\\":\\\"2019-05-02 10:23:29\\\"}\"}"
    }
  ],
  "first_page_url": "http://localhost/v2/users/1/chat-rooms?page=1",
  "from": 1,
  "last_page": 1,
  "last_page_url": "http://localhost/v2/users/1/chat-rooms?page=1",
  "next_page_url": null,
  "path": "http://localhost/v2/users/1/chat-rooms",
  "per_page": 15,
  "prev_page_url": null,
  "to": 1,
  "total": 1
}

Обратите внимание, что я могу получить данные из $item->last_message для установки данных на $test1, но при разборе объекта на JSON данные $item->last_message будут null

Как я могу это решить, спасибо

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Как я нахожу в кодах Laravel, у него могут быть функции, которые могут изменить результат результата json_encode(), поэтому я решил проанализировать разбитое на страницы значение в json, затем проанализировать объект массива для изменения данных и, наконец, проанализировать обратно в json для ответа

Мой код

// Parse to JSON then parse back to array object 
// To make sure the format is correct (Same as Laravel standard)
$json = $rooms->toJson();
$parsedJson = \json_decode($json, true);
$items = $parsedJson['data'];
$count = count($items);
for ($i = 0; $i < $count; $i++)
{
    $item = $items[$i];
    if (!$item['last_message'])
    {
        $item['last_message'] = array(
            'message' => 'Has joined the chat', /* TODO: may change this message later */
            'created_at' => $item['created_at'], 
            'updated_at' => $item['updated_at']);
    }
    $parsedJson['data'][$i] = $item;
}
0 голосов
/ 02 мая 2019

из larval doc

В отличие от большинства других методов сбора, преобразование изменяет саму коллекцию.Если вы хотите создать новую коллекцию вместо этого, используйте метод карты.

Итак, я бы посоветовал вам использовать карту примерно так

$rooms->getCollection()->map(function ($item) {
  if (!$item->last_message) {
    $item->last_message = (object) array('updated_at' => ''.$item->updated_at);
  }
  $item->test0 = $item->id;
  $item->test1 = $item->last_message;
  $item->test2 = \json_encode($item->last_message);
  $item->test3 = \json_encode($item);
  return $item;
});
...