1
votes

Fusionner deux tableaux json en un

J'ai essayé de fusionner deux réponses JSON en une seule, mais le problème est que les données sont affichées dans deux tableaux et je les veux dans un seul tableau. Comment puis-je y parvenir dans Lumen / Laravel

J'ai essayé de contatiniser deux tableaux ou réponses

{
   "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"
}

Attendu: -

{
    "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"
}

Obtenu: -

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


4 commentaires

Cela peut aider si vous incluez les données sources, nous avons les résultats attendus, les résultats réels, mais pas ceux [données sources] - ce qui est bien ... assez important.


Je peux vous dire que vous voudrez probablement utiliser array_replace_recursive ($ primary, $ secondary) après les json_decoding les deux. PS n'est probablement pas un mot, mais j'aime ça. Ok .. il s'avère que c'est oxforddictionaries :-(


@ArtisticPhoenix pouvez-vous m'aider avec ce genre de problème stackoverflow.com/questions/55593703/...


Malheureusement, je n'ai pas encore utilisé Laravel, je suis en fait dans la phase de planification d'un projet pour mon travail, mais nous allons l'externaliser au départ car je suis trop occupé par d'autres choses. Mais je prévois de m'appuyer dessus plus tard, c'est essentiellement un système CRUD pour nos données entrantes, ce qui devrait être assez facile à faire. Puis plus tard, je plante pour construire dessus. Actuellement, nous utilisons principalement Code Igniter 2, que j'ai construit il y a environ 5 ans et que je continue à améliorer.


3 Réponses :


2
votes

Il manque des pièces, mais je pense voir ce qui se passe.

D'après le résultat que vous obtenez, cela ressemble à $ posts et $ post_image code> dans ce code sont des modèles éloquents.

$merged = $a->toArray() + $b->toArray(); 

Lorsque vous les concaténez, leurs méthodes __toString () les convertissent en chaînes, ce qui est fait en utilisant la méthode toJson () . Donc, fondamentalement, vous avez deux objets JSON collés ensemble, ce qui n'est pas un JSON valide, puis la méthode successResponse () les encode à nouveau.

Pour les fusionner, vous pouvez les convertir aux tableaux, fusionnez-les, puis passez le résultat à successResponse().

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

Le résultat que vous voulez est impossible, cependant. L'objet "post" a deux valeurs différentes de "id". Vous ne pourrez en obtenir qu'un. Si vous utilisez

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

Alors la valeur id du deuxième objet remplacera le premier. Si vous souhaitez conserver la première valeur d'identifiant, vous devez utiliser union au lieu de array_merge.

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


1 commentaires

Aidez-moi avec ceci s'il vous plaît stackoverflow.com/questions/55593703/...



0
votes

Je pense que vous ne pouvez pas concaténer 2 objets JSON sous forme de chaînes.

La bonne façon serait de:

  1. Récupérez les objets Post et PostImage

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

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

  2. Sérialiser l'objet Post https://laravel.com/docs/5.8/eloquent-serialization p >

  3. Utilisez la méthode décrite ci-dessous pour ajouter chaque champ de l'objet PostImage (image_name1 .. image_name5) au JSON Comment ajouter un attribut en JSON en PHP? p >

  4. Renvoyer le JSON

Mise à jour:

Post :: orderBy ('id', 'DESC') -> get () -> first () renvoie un objet.

Post :: orderBy ('id', 'DESC') -> get () renvoie une collection d'objets et cela nécessiterait une approche différente.

Essayez ceci:

$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);


3 commentaires

mais cela fonctionne bien si j'essaye pour $ post = Post :: orderBy ('id', 'DESC') -> get () -> first () valeurs mais pas pour tout quand je supprime la fonction first (). Il spécifie que image_name1 n'existe pas dans la collection


J'ai mis à jour la réponse. Si cela ne fonctionne pas pour vous, veuillez expliquer plus en détail ce que vous souhaitez faire.


pouvez-vous vérifier ceci stackoverflow.com/questions/55593703/...



0
votes

Vous pouvez certainement concaténer deux tableaux JSON, vous devez analyser les objets et les concaténer et ré-stringifier.

Cette question peut également trouver une réponse ici. https://stackoverflow.com/a/10384890/1684254