2017-10-16 15 views
2

私は誰かがこの特定の問題を手伝ってくれることを願っています。 私はPHPとMySQLを初めて使っていますが、できる限り最善を尽くしています。また、似たような質問が出されていることは知っていますが、残念ながら私の思うような角度で試してみてください。問題:第2の数の詳細を保持し、そして第三は、「静的で、3つのテーブルのSQLクエリからのPHPマルチ配列(JSON)

|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  

最初の表は、連絡先の名前が含まれています。私はこのような構造、シンプルな電話帳のための3 MySQLテーブル(連絡先、電話番号、電話のタイプを)持っています電話番号の種類を参照するためのテーブル。

さて、私はPHPで簡単なCRUDアプリケーションのためのAPIを作成していると私は私が想定として構成結果を与える配列の作成にこだわっている:

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

私は、クエリをを使用して:

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 

そして、私は上記の配列を作成するためのPHP構文に固執しています。あなたは正しい方向に私を向けるのを助けることができますか?

また、これはCRUD関数を示す小さな割り当てであるため、私のデータベースについてはわかりませんが、3つのテーブル構造は問題ありませんか?それを別のものに変更する必要がありますか?

ありがとうございます!乾杯!

+0

'PhoneNumbers:'はオブジェクトの配列ではなく、単一のオブジェクトであるべきですか? – Barmar

+0

おっと、そうです。おそらく、私はもはや役に立たないので寝るべきです。それはここ2時30分です.G'night良い人よ、明日は今日より良いことを願って... – cobster

答えて

1

すべてのテーブルにIDのカラムがある場合は、phonenumbers.idcontacts.idを区別するためにSQLでエイリアスを使用する必要があります。したがって、クエリを次のように変更してください。

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 

ここでは、PDOを使用していると仮定してコードを示します。 mysqliも同様です。

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

結果のJSONは、次のようになります。

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

PhoneNumbersは、すべての電話番号の配列で、PhoneTypeはタイプ名ではなく、そのIDです。タイプIDのみが必要な場合は、phonetypesに参加する必要はありません。

+0

ありがとう@バーマール!まさに私が探していたもので、魅力のように働いています! – cobster

関連する問題