3
votes

Modifier la réponse dans laravel

Ci-dessous mon code de contrôleur Laravel

[
  {
    "id": 11,
    "parent_id": 0,
    "name": "Category 1",
    "children": [
      {
        "id": 63,
        "parent_id": 11,
        "name": "Category 2",
        "children": [
          {
            "id": 73,
            "parent_id": 63,
            "name": "Category 3"
          }
        ]
      },
      {
        "id": 77,
        "parent_id": 11,
        "name": "Category 5",
        "children": [
          {
            "id": 83,
            "parent_id": 77,
            "name": "Category 8"
          }
        ]
      }
    ]
  }
]

Ici, la sortie de la méthode ci-dessus;

[
  {
    "id": 11,
    "parent_id": 0,
    "name": "Category 1"
  },
  {
    "id": 63,
    "parent_id": 11,
    "name": "Category 2"
  },
  {
    "id": 73,
    "parent_id": 63,
    "name": "Category 3"
  },
  {
    "id": 77,
    "parent_id": 11,
    "name": "Category 5"
  },
  {
    "id": 83,
    "parent_id": 77,
    "name": "Category 8"
  }
]

Maintenant, je veux formater cette réponse base sur la valeur de parent_id .

La condition est: lorsque parent_id est égal à id , alors le parent_id est considéré comme des enfants de id.

Veuillez noter que les deux parent_id et id sont stocké sous forme de valeurs incrémentielles.

Je souhaite modifier et renvoyer la réponse comme ci-dessous;

public function templateValueData($template_id)
{
    $parent = TemplateMetadataValue::where('template_id', $template_id)->get();

    return $parent;
}

Comment puis-je y parvenir?

p>


0 commentaires

3 Réponses :


0
votes

Vous devez appeler votre relation sur votre contrôleur:

public function templateValueData(TemplateMetadataValue $template)
{
    return $template->load('children')->get();
}

Vous pouvez également utiliser l'injection de méthode sur vos méthodes de contrôleur, vous pouvez donc utiliser ce code:

public function templateValueData($template_id)
{
    $parent = TemplateMetadataValue::where('template_id',$template_id)->with('children')->get();

    return $parent;
}


0 commentaires

0
votes

Si vous modifiez légèrement votre modèle TemplateMetadataValue , vous pouvez obtenir le résultat souhaité.

$parent = TemplateMetadataValue::with('children')->get();

Appelez-le avec la méthode children .

class TemplateMetadataValue extends Model {

    public function children() {
        return $this->hasMany(static::class, 'parent_id');
    }
}

Le reste de la connexion que vous pouvez appliquer ici avec votre générateur de requêtes.


1 commentaires

Cela donnera des résultats comme `[{" id ": 11," parent_id ": 0," name ":" Category 1 "," children ": [{" id ": 63," parent_id ": 11," name " : "Catégorie 2",}, {"id": 77, "parent_id": 11, "name": "Catégorie 5",}]}] `



1
votes

Utilisez le code ci-dessous pour obtenir votre réponse.

function xyz($parents,$parent_id = 0){
    $res = [];
    foreach ( $parents as $parent ) {
        if ( $parent[ "parent_id"] == $parent_id ){
            $children = $this->xyz($parents, $parent[ "id"]);
            if ($children) {
                 $parent[ "children"] = $children;
            } 
            $res[]=$parent;
        }
    }
    return $res;
}

Fonction pour obtenir la réponse.

public function templateValueData($template_id)
{
    $parents = TemplateMetadataValue::where('template_id', $template_id)->get();
    $arr = $this->xyz($parents);
    return $arr;
} 


0 commentaires