2017-10-16 6 views
2

J'espère que quelqu'un peut m'aider avec ce problème spécifique. Je suis novice en PHP et MySQL mais j'essaie du mieux que je peux. Aussi, je sais que des questions similaires ont probablement été posées, mais malheureusement j'ai essayé tous les angles possibles pour modifier ces tutoriels/réponses en fonction de mes besoins, mais malheureusement j'ai échoué lamentablement ..PHP multi array (JSON) de requête SQL sur trois tables

Alors, voici mon problème: J'ai 3 tables MySQL (contacts, numéros de téléphone et les types de téléphone) pour répertoire simple, structuré comme celui-ci:

|ID |name |   |ID |cID |tID |number|   |ID |type | 
----------------------------------------------------------------------- 
1 John    1 1  2  123456   1 Home 
2 Mary    2 2  1  234567   2 Mobile 
3 Sue    3 1  3  213234   3 Work 
         4 2  2  444321    
         5 3  2  555543  

Le premier tableau contient les noms de contact, deuxième détient les informations numériques, et le troisième est « statique "Table pour référencer les types de numéros de téléphone.

Maintenant, je crée une api pour application simple crud en PHP et je suis coincé à la création du tableau qui me donnera le résultat structuré comme j'envisagé:

[ 
{"ContactID": 1, 
    "ContactName": "John", 
    "PhoneNumbers": { 
    "PhoneNumberID": 1, 
    "PhoneType":  2, 
    "PhoneNumber": 123456 
    } 
}, 
{...}, 
{...} 
] 

La requête que je suis l'utilisation est:

SELECT contacts.*, pt.type, pn.number, pn.id 
FROM contacts 
     LEFT JOIN phonenumbers pn ON c.ID = pn.cID 
     LEFT JOIN phonetypes pt ON pn.tID = pt.ID 

Et maintenant je suis bloqué à la syntaxe PHP pour créer le tableau mentionné ci-dessus. Pouvez-vous m'aider dans la bonne direction, s'il vous plaît?

En outre, comme il s'agit d'une petite affectation démontrant les fonctions CRUD, je ne suis pas sûr de ma base de données, la structure des trois tables est-elle correcte? Ai-je besoin de le changer pour autre chose?

Merci d'avance! À votre santé!

+0

'PhoneNumbers' ne devrait-il pas être un tableau d'objets, pas un seul objet? – Barmar

+0

Oups, vous avez raison. Je devrais probablement aller au lit parce que je ne suis plus d'aucune utilité. Il est deux heures et demie ici..Bonnes gens bien, j'espère que demain sera meilleur qu'aujourd'hui ... – cobster

Répondre

1

Si toutes les tables ont des colonnes ID, vous devez utiliser un alias dans le SQL pour distinguer phonenumbers.id de contacts.id. Changez donc la requête en:

SELECT contacts.*, pt.type, pn.number, pn.id AS phoneid 
FROM contacts 
LEFT JOIN phonenumbers pn ON c.ID = pn.cID 
LEFT JOIN phonetypes pt ON pn.tID = pt.ID 

Voici le code en supposant que vous utilisez PDO; mysqli sera similaire.

$result = array(); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC) { 
    if (!isset($result[$row['ContactID']]) { 
     // If this is the first row for this contact, create an entry in the results 
     $result[$row['ContactID']] = array(
      'ContactID' => $row['ID'], 
      'ContactName' => $row['name'], 
      'PhoneNumbers' => array() 
     ); 
    } 
    // Add this phone number to the `PhoneNumbers` array 
    $result[$row['ContactID']]['PhoneNumbers'][] = array(
     'PhoneNumberID' => $row['phoneid'], 
     'PhoneType' => $row['type'], 
     'PhoneNumber' => $row['number'] 
    ); 
} 
$result = array_values($result); // Convert from associative to indexed array 
// Convert to JSON 
echo json_encode($result); 

Le résultat JSON ressemblera à ceci:

[ 
{"ContactID": 1, 
    "ContactName": "John", 
    "PhoneNumbers": [ 
    { 
    "PhoneNumberID": 1, 
    "PhoneType":  "Mobile", 
    "PhoneNumber": "123456" 
    }, 
    { 
    "PhoneNumberID": 3, 
    "PhoneType":  "Work", 
    "PhoneNumber": "213234" 
    } 
}, 
{...}, 
{...} 
] 

PhoneNumbers est un tableau de tous les numéros de téléphone et PhoneType est le nom du type, pas son ID. Si vous ne voulez que l'ID de type, vous n'avez pas besoin de vous joindre à phonetypes.

+0

Merci @Barmar! Exactement ce que je cherchais, travaillant comme un charme! – cobster