2014-02-18 15 views
2

我想從兩個相關的MySQL表中構建一個json輸出。 我有一個「餐廳」和餐桌「菜餚」餐桌餐桌中的每個項目都有幾個相關項目在菜餚表中由ID引用。每個餐館商品ID都是Dishes表中的外鍵,即f_id。Json從PHP中的兩個mysql表中讀取

例如: 餐館的餐桌

+----+-------------+-----------+ 
| Id | Name  | Misc Info | 
+----+-------------+-----------+ 
| 1 | Restaurant1 | Some Info | 
+----+-------------+-----------+ 

菜表

+----+------+-----------+-------------+ 
| Id | f_id | dish | description | 
+----+------+-----------+-------------+ 
| 1 | 1 | DishName | DishDesc. | 
| 2 | 1 | DishName2 | DishDesc. | 
+----+------+-----------+-------------+ 

我想創建那些表輸出的JSON看起來像這樣:

{ 
    "Restaurants": [ 
     { 
      "name": "String content", 
      "misc info": "String content" 
      "Dishes": [ 
       { 
        "dish": "String content", 
        "description": "String content" 

       }, 
       { 
        "dish": "String content", 
        "description": "String content" 
       } 
      ], 

     }, 
     { 
      "name": "String content", 
      "misc info": "String content" 
      "Dishes": [ 
       { 
        "dish": "String content", 
        "description": "String content" 
       }, 
       { 
        "dish": "String content", 
        "description": "String content" 
       } 
      ], 

     } 
    ] 
} 

我使用PHP和mysql_query方法來找出邏輯,我計劃使用PDO生產版本。這是我迄今爲止嘗試過的代碼。

//Create Our Query 
$srtResult = "SELECT * FROM Restaurants"; 

//Execute Query 
$result=mysql_query($srtResult); 
//Iterate Throught The Results 

while ($row = mysql_fetch_assoc($result)) { 
    $count = $row['id']; 
    $srtResult2 = "SELECT * FROM Dishes WHERE id = $count"; 
    $result2 = mysql_query($srtResult2); 
    while(mysql_num_rows($result2)){ 
     $dishes = mysql_fetch_row($result2); 
     $dishList[] = Array(
      "dish" => $dishes[3], 
      "description" => $dishes[4]); 
    } 
    $json['Restaurants'][] = 
     Array("Restaurants" => Array(
       "name" => $row['name'], 
     "Dishes" => Array(
      $dishList))); 
} 
header('Content-type: application/json'); 
echo json_encode($json); 

我的問題是根據當前餐廳項目的菜餚不重複,每個餐廳項目,我從第一次館子的菜。 我認爲問題在於循環本身,因爲我在每個Restaurant包裝器中獲得了不同的int計數。任何幫助將不勝感激,我已經爲此工作了好幾天,並且已經耗盡了我的基本PHP知識。

回答

2

您正在使用非常多的查詢。爲什麼不在一個查詢中完成?

SELECT * FROM `Restaurants` `r` 
    LEFT JOIN `Dishes` `d` ON (`r`.`id` = `d`.`f_id`) 
ORDER BY `r`.`id` ASC 

然後使用結果構建JSON對象。

EDIT 爲了便於迭代的結果,我改了一下查詢到:

SELECT 
`r`.`id` as `restaurantId`, 
`r`.`name`, 
`r`.`info`, 
`d`.`id` AS `dishId`, 
`d`.`dish`, 
`d`.`description` 
FROM `restaurants` `r` 
    LEFT JOIN `dishes` `d` ON (`r`.`id` = `d`.`f_id`) 
ORDER BY `r`.`id` ASC 

結果會是這樣的: restaurantId, name, info, dishId, dish, description

您現在可以遍歷喜歡的結果這個:

$jsonArray = array(); 

foreach ($record as $dishDetails){ 
    // details of the restaurant 
    $jsonArray[$dishDetails['f_id']]['name'] = $dishDetails['name']; 
    $jsonArray[$dishDetails['f_id']]['info'] = $dishDetails['info']; 

    // build the dishes of the restaurant 
    $jsonArray[$dishDetails['f_id']]['dishes'][$dishDetails['dishId']]['dish'] = $dishDetails['dish'] 
    $jsonArray[$dishDetails['f_id']]['dishes'][$dishDetails['dishId']]['description'] = $dishDetails['description'] 
} 
+0

感謝您的回覆,我試過了您的查詢。雖然它用於獲取我需要的數據,但是使用該查詢,我爲每個與其關聯的菜餚獲得了一排餐廳。當我把它放在這個循環中時,我會爲每個菜餚獲得一家新餐廳,但是,我需要爲每個餐館的菜品提供一系列菜餚。 – Anton

+0

這裏是我現在使用的代碼 'while($ row = mysql_fetch_assoc($ result)){ \t $ count = $ row ['id']; \t而($行[ 'F_ID'] = $計數){ \t \t $ dishList [] =陣列( \t \t \t 「菜」=> $行[ '菜'], \t \t \t 「說明」 => $ row ['description']); \t} \t $ JSON [ '餐館'] [] = \t \t陣列( 「餐廳」=>數組( \t \t \t \t 「名稱」=> $行[ '名稱'], \t \t \t \t 「經度」=> $行[ '經度'], \t \t \t \t 「緯度」=> $行[ '緯度'], \t \t 「菜」=>數組( \t \t \t $ dishList))); }' – Anton

+0

你從這個查詢中得到的結果是完全正確的。 所有你需要做的就是解析數組。 解析數組(處理內存中的數據)會更快,更高效,而不是在第一個查詢中爲每個結果發送新查詢。 – Dragos

0

這是我用過的有效解決方案:

<?php 
session_start(); 
error_reporting(E_ALL^E_NOTICE); 
function __autoload($classname) { 
    $filename = "classes/". $classname.".class.php"; 
    include_once($filename); 
}`enter code here` 
$recepie=new recepie(new database()); 
$recepies=mysql_query("SELECT * FROM recepies"); 
while ($recipe=mysql_fetch_assoc($recepies,MYSQL_ASSOC)) 
{ 
$rec_id=$recipe['rec_id']; 
$ingredients=mysql_query("SELECT * FROM recepie_ingredients WHERE rec_id=".$rec_id); 

unset($ing); 
$ing= array(); 
    while($ingredient=mysql_fetch_assoc($ingredients,MYSQL_ASSOC)) 
    { 
        $ing[]=array("ing_id"=>$ingredient['ing_id'], 
           "ing_name"=>$ingredient['ing_name'], 
           "ing_amount"=>$ingredient['ing_amount'], 
           "ing_unit"=>$ingredient['ing_unit']); 
    } 

        $json["Recepies"][]=array("rec_id"=>$recipe['rec_id'], 
               "rec_name"=>$recipe['rec_name'], 
               "rec_image"=>$recipe['rec_image'], 
               "rec_createby"=>$recipe['rec_createby'], 
               "rec_createdate"=>$recipe['rec_createdate'], 
               "rec_description"=>$recipe['rec_description'], 
               "rec_Ingredients"=>$ing); 


} 
echo json_encode($json); 

?>