将JOIN SQL查询序列化为JSON的最佳方法

时间:2015-06-16 12:10:19

标签: php mysql json codeigniter join

我无法找到问题的好标题。我正在做一个Restful API / JSON

我的问题是:

我有两张桌子:

Product: id, name
Prices: id_product, price

Product 1--* Prices (One product have got multiples prices)

所以,如果我想导出JSON中的下一个信息

products: [
     {
          id:1
          name: chair
          prices: [3.3,5.0,6.0]
     }
      , {
          id:2
          name: apple
          prices: [2.0,5.0]
     } ,..
]

我做下一个查询:

SELECT product.id, product.name, prices.price FROM procut LEFT JOIN prices ON product.id = prices.id_product

我得到了下一个结果:

id  , name  , prices
----------------------
 1    chair    3.3
 1    chair    5.0
 1    chair    6.0
 2    apple    ...
...

我使用PHP,codeigniter。有没有办法在井形式JSON中进行转换?因为我必须重建结果,所以:

        $resultArray = $query->result_array();  //CodeIgniter

        foreach($resultArray as $row)
        {
            if(!isset($resultData[$row['id']]))
            {
                $resultData[$row['id']] = $row;
                unset($resultData[$row['id']]['price']);

                $resultData[$row['id']]['prices'] = array();

            }

            $resultData[$row['id']]['prices'][] = $row['price'];
        }

创建结构良好的JSON

2 个答案:

答案 0 :(得分:1)

使用PHP对SQL的结果进行排序是正常的做法,所以你的方法是正确的。

    $result = array();
    foreach($query->result_array() as $row)
    {
        $result[$row['id']] = array(
            'id'=>$row['id'],
            'name'=>$row['name'],
            'price'=>isset($result[$row['id']]['price']) ? array_push($result[$row['id']]['price'],$row['price']) : array($row['price'])
        );
    }

    $this->output
                ->set_content_type('application/json')
                ->set_output(json_encode(array('products'=>array_values($result))));

答案 1 :(得分:0)

我会这样做(假设你的价格表中有多行)。与你的做法相比,我觉得这样做更干净。这可以是模型类中的方法

$this->db->select("id, name");
$this->db->from("product");
$q = $this->db->get();
$products = $q->result();
foreach ($products as $product) {
    $this->db->select("price");
    $this->db->from("prices");
    $this->db->where("id_product", $product->id);
    $q = $this->db->get();
    $product->prices = $q->result();
}

$json = json_encode($products);
var_dump($json);