Объединить два массива JSON в один - PullRequest
1 голос
/ 08 апреля 2019

Попытка объединения двух ответов JSON в один, но проблема в том, что данные отображаются в двух массивах, и я хочу, чтобы они были в одном массиве.Как мне добиться этого в Lumen / Laravel

Пробовал связать два массива или ответы

 public function index(Request $request)
    {
        $post = Post::orderBy('id', 'DESC')->get();
        $post_images = PostImage::orderBy('id', 'DESC')->get();
        return $this->successResponse($posts.$post_image );        
    }

Ожидается: -

{
    "post": {
        "id": 14,
        "post_id": 798965728,
        "user_id": 1,
        "location": "first",
        "title": "un8852",
        "cooked_time": "1554329910",
        "dispose_time": "1554373110",
        "food_type": "nv",
        "description": "asdfg",
        "serve_quantity": 23,
        "lat": 19.08,
        "lon": 73,    
        "id": 10,
        "post_id": 798965728,
        "image_name1": null,
        "image_name2": null,
        "image_name3": null,
        "image_name4": null,
        "image_name5": null,
    },
    "st": "1",
    "msg": "success"
}

Получено: -

{
   "post":"{\"id\":14,\"post_id\":798965728,\"user_id\":1,\"location\":\"first\",\"title\":\"un8852\",\"cooked_time\":\"1554329910\",\"dispose_time\":\"1554373110\",\"food_type\":\"nv\",\"description\":\"asdfg\",\"serve_quantity\":23,\"lat\":19.08,\"lon\":73,\"created_at\":\"2019-04-04 10:20:18\",\"updated_at\":\"2019-04-04 10:20:18\"}{\"id\":10,\"post_id\":798965728,\"image_name1\":null,\"image_name2\":null,\"image_name3\":null,\"image_name4\":null,\"image_name5\":null,\"created_at\":\"2019-04-04 10:20:18\",\"updated_at\":\"2019-04-04 10:20:18\"}",
   "st":"1",
   "msg":"success"
}

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Там есть некоторые недостающие фрагменты, но я думаю, что вижу, что происходит.

Исходя из того, что вы получаете, похоже, $posts и $post_image в этом коде красноречивые модели.

return $this->successResponse($posts.$post_image ); 

Когда вы объединяете их, их методы __toString() преобразуют их в строки, что делается с помощью метода toJson(). Таким образом, в основном у вас есть два объекта JSON, сшитые вместе, что не является допустимым JSON, а затем метод successResponse() снова их кодирует.

Чтобы объединить их, вы можете преобразовать их в массивы, объединить их, а затем передать результат в successResponse().

$merged = array_merge($posts->toArray(), $post_image->toArray());
return $this->successResponse($merged);

Однако желаемый результат невозможен. Объект «post» имеет два разных значения «id». Вы сможете получить только один. Если вы используете

$merged = array_merge($posts->toArray(), $post_image->toArray());

Тогда значение id второго объекта заменит первый. Если вы хотите сохранить первое значение идентификатора, вам нужно использовать union вместо array_merge.

$merged = $a->toArray() + $b->toArray(); 
0 голосов
/ 09 апреля 2019

Вы можете однозначно объединить два массива JSON. Вы должны проанализировать объекты, объединить их и переформатировать.

На этот вопрос можно ответить и здесь.https://stackoverflow.com/a/10384890/1684254

0 голосов
/ 09 апреля 2019

Я думаю, вы не можете объединить 2 объекта JSON в виде строк.

Правильный способ будет:

  1. Получить объекты Post и PostImage

    $ post = Post :: orderBy ('id', 'DESC') -> get ();

    $ post_images = PostImage :: orderBy ('id', 'DESC') -> get ();

  2. Сериализация объекта Post https://laravel.com/docs/5.8/eloquent-serialization

  3. Используйте метод, описанный ниже, чтобы добавить каждое поле объекта PostImage (image_name1 .. image_name5) в JSON Как добавить атрибут в JSON в PHP?

  4. Вернуть JSON

Обновление:

Post :: orderBy ('id', 'DESC') -> get () -> first () возвращает один объект.

Post :: orderBy ('id', 'DESC') -> get () возвращает коллекцию объектов, и для этого потребуется другой подход.

Попробуйте это:

$post = Post::orderBy('id', 'DESC')->get();

$post->map(function ($item, $key) {
    $post_images = PostImage::where('post_id', $item->id)->get()->first();
    $item->setAttribute('image_name1',$post_images->image_name1);
    $item->setAttribute('image_name2',$post_images->image_name2);
    $item->setAttribute('image_name3',$post_images->image_name3);
    $item->setAttribute('image_name4',$post_images->image_name4);
    $item->setAttribute('image_name5',$post_images->image_name5);
    return $item;
});

return $this->successResponse($posts);
...