Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fusionner deux colonnes sql dans un alias pour JSO

Sujet résolu
1 mars 2024 à 14:29:44

Bonjour !

Je cherche à écrire un fichier JSON en faisant un select sur une base de donnée glpi, sauf que pour des raisons pratiques je cherche à avoir dans mon fichier json le champ "full_name" qui va regrouper le realname et le firstname comme dans la bdd glpi :

Quelle pourrait être la meilleure solution ? Actuellement mon code ressemble à ça

$data = $dbh->query("SELECT id, realname, firstname FROM glpi_users")->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $row) {
	$contacts[]=$row;
}

$json = json_encode($contacts, JSON_PRETTY_PRINT);
file_put_contents('test.json', $json);

Il me permet bien d'écrire un fichier json mais avec ces données :

[
    {
        "id": 2,
        "realname": "NOM",
        "firstname": "Prenom"
    },
    {
        "id": 3,
        "realname": "POST",
        "firstname": "Post"
    },
    {
        "id": 4,
        "realname": "TECH",
        "firstname": "Tech"
    },
    {
        "id": 5,
        "realname": "NORMAL",
        "firstname": "Normal"
    },
    {
        "id": 6,
        "realname": "Support",
        "firstname": null
    }
]

Merci d'avance et bonne journée !


  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2024 à 15:57:26

SELECT id, CONCAT_WS(' ', realname, firstname) AS full_name FROM glpi_users ?

Ton foreach ne sert strictement à rien, $data et $contacts (qui n'est même pas initialisée, ce qui devrait valoir un warning) valent la même chose.

PS : on ne voit pas ton image

-
Edité par julp 1 mars 2024 à 16:00:16

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2024 à 15:59:05

Bonjour , ta boucle ici n'est pas très utile de ce que j'en vois $data et $contacts contiendront exactement la même chose , donc autant utiliser directement data.

ensuite vu les données un map sur ton tableau devrait suffir

json_encode(array_map(fn($row):array => [

  "fullname" => $row["realname"].$row["firstname"],

  "id" => $row["id"]

],$data),....

ou le faire directement dans ta requete , je ne sais pas si tj as des raisons pratiques de faire ainsi (avec un concat)

-
Edité par zvheer 1 mars 2024 à 16:00:10

  • Partager sur Facebook
  • Partager sur Twitter

yasakani no magatama

1 mars 2024 à 17:06:41

Merci à vous deux pour vos réponses !

J'ai fait un forearch par habitude mais effectivement, c'est tout pareil sans !

@julp Merci ! C'est bien plus propre que ce que j'avais fait, et qui fonctionnait malgré tout : 

$data = $dbh->query("SELECT glpi_users.id, realname, firstname, picture AS avatar FROM glpi_users INNER JOIN glpi_groups_users ON (SELECT groups_id AS post FROM glpi_groups_users WHERE glpi_groups_users.users_id = glpi_users.id)")->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $row) {
	$row['full_name'] = $row['realname']. " ".$row['firstname'];
    unset($row['realname'], $row['firstname']);
	$contacts[]=$row;
}

J'ai pu remplir mon fichier par contre avec glpi, il faut faire des jointures partout, ne serait-ce que pour récuperer le nom d'un groupe par rapport à son ID, c'est pas très pratique... J'ai modifié ma requête afin d'en faire une jointure, le script fonctionne bien, mais ça ne va pas alimenter mon fichier json avec la valeur "post"

$contacts=array();

$data = $dbh->query("SELECT glpi_users.id, CONCAT_WS(' ', realname, firstname) AS full_name FROM glpi_users INNER JOIN glpi_groups_users ON (SELECT groups_id AS post FROM glpi_groups_users WHERE glpi_groups_users.users_id = glpi_users.id)")->fetchAll(PDO::FETCH_ASSOC);
$contacts[]=$data;

$json = json_encode($contacts, JSON_PRETTY_PRINT);
file_put_contents('test.json', $json);

Merci beaucoup ! 

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2024 à 18:10:12

> mais ça ne va pas alimenter mon fichier json avec la valeur "post"

C'est-à-dire ?

C'est normal que tu mettes un tableau (le résultat de la requête $data) dans un tableau (en $contacts[0]) ?

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2024 à 18:16:56

julp a écrit:

> mais ça ne va pas alimenter mon fichier json avec la valeur "post"

C'est-à-dire ?

C'est normal que tu mettes un tableau (le résultat de la requête $data) dans un tableau (en $contacts[0]) ?

Hé bien, si j'execute mon script tel qu'en haut, j'ai bien un fichier json qui va se créer, mais il n'aura que la valeur id et full_name :

Actuellement mon script PHP est ainsi : 

$data = $dbh->query("SELECT glpi_users.id, CONCAT_WS(' ', glpi_users.realname, glpi_users.firstname) AS full_name FROM glpi_users INNER JOIN glpi_groups_users ON (SELECT glpi_groups_users.groups_id AS post FROM glpi_groups_users WHERE glpi_groups_users.users_id = glpi_users.id)")->fetchAll(PDO::FETCH_ASSOC);
$contacts=$data;

$json = json_encode($contacts, JSON_PRETTY_PRINT);
file_put_contents('test.json', $json);

Mais malgré ça, voici mon fichier JSON, il ne recupere que l'id et le full_name sans prendre en compte le groupe que je vais chercher avec mon inner join

[
    {
        "id": 2,
        "full_name": "NOM Prenom"
    }
]

Merci !


-
Edité par MDevillers 1 mars 2024 à 21:15:24

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2024 à 22:17:07

Une requête ne "retourne" que ce que tu spécifies en partie SELECT. Bon, après avec ta sous-requête en condition de jointure (comment ça peut fonctionner d'ailleurs ?), ça va être compliqué d'inclure les données de l'alias post.

SELECT
    glpi_users.id,
    CONCAT_WS(' ', glpi_users.realname, glpi_users.firstname) AS full_name,
    glpi_groups_users.groups_id AS post
FROM glpi_users
INNER JOIN glpi_groups_users ON glpi_groups_users.users_id = glpi_users.id
;

Non ? Tu comprends vraiment ce que tu écris ?

HS : c'est de pire en pire ce site, maintenant, modifier te renvoie sur leur home

-
Edité par julp 1 mars 2024 à 22:23:27

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2024 à 22:23:58

Qu'est-ce qui ne va pas dans ma requête ? J'ai toujours fait de cette manière et je n'ai jamais eu de soucis

Avec ton code ça passe bien pour alimenter le json en effet, mais je t'avoue que je ne comprends pas, quand je fais un select de manière totalement classique je procede avec la même écriture (qui n'est pas optimale je te l'accorde), et ça passe bien !

Je t'avoue que j'ai pas mal galéré pour modifier mon message aussi ^^'

-
Edité par MDevillers 1 mars 2024 à 22:29:21

  • Partager sur Facebook
  • Partager sur Twitter