2017-10-05 1 views
0

Mon code a Json Column nommé: json pour les champs utilisateur personnalisés. Je veux que mon datatable obtienne cette colonne de json en tant que champs individuels pour l'affichage. Donc, essentiellement, si mes données retourne modèle comme:Champ JSON Laravel pour modéliser les attributs pour la table de données avec Paginate

{ 
"id":1 
"json" : { 
    "name": "joe"  
    } 
} 

je besoin de transformer en (quand je l'appelle Model :: tous() ou Model :: paginate()):

{ 
"id":1 
"name": "joe" 
} 

Alors que mon Datatable peut montrer ces données. Je ne peux pas ajouter de propriété appends à mon modèle car ce json est un champ dynamique et donc pas connu depuis le début. J'ai essayé ces deux variantes:

public function getJsonAttribute($value) 
{ 
    $json = json_decode($value); 
    foreach ($json as $k => $v) { 

     array_push($this->appends, $key); 
     // or 
     $this->attributes[$k] = $v; 
    } 
    return $json; 
} 

Mais aucun d'eux ne fonctionne.

Répondre

2

Dans votre cas, cela peut être un travail. Mais son multi-array signifie que vous pouvez ajouter une boucle foreach supplémentaire. alors seulement travailler.

Dans votre code clé $ n'est pas définie

public function getJsonAttribute($value) 
{ 
    $json = json_decode(json_encode($value),TRUE); 
    $jsonArr = []; 
    foreach ($json as $k => $v) { 
     if($k == "id") 
      $jsonArr['id'] = $v; 
     if($k == "json" && empty($v['name']) === false) 
      $jsonArr['name'] = $v['name']; 
    } 

    return (object)$jsonArr; 
} 
+1

Oh Merci au sujet de cette faute de frappe sur la touche ** $ **. Bien que votre code fasse la chose par défaut. Json me renvoyait déjà un tableau associatif de paires clé => valeur, donc je n'ai pas besoin de le convertir en tableau pour retourner. Je l'ai résolu en bouclant la collection et en exécutant une fonction sur toutes les instances du modèle qui exécute la boucle foreach que j'ai appliquée à ** getJsonAttribute **. –