如何使用PDO检索包含许多表的表

时间:2016-05-19 07:05:26

标签: php mysql pdo

最近我一直在使用PDO

我希望得到一张包含hasmany相关表格的表格。

我可以得到一张包含这样的表的表

array (
  0 => 
  stdClass::__set_state(array(
     'order_id' => '170',
     'purchase_id' => '222',
     'product_option_id' => '014',
  )),
  1 => 
  stdClass::__set_state(array(
     'order_id' => '170',
     'purchase_id' => '600',
     'product_option_id' => '015',
  )),
)

使用像这样的SQL查询

SELECT ord.order_id,puc.purchase_id,puc.product_option_id
FROM order ord
JOIN purchase puc
ON ord.order_id = puc.order_id
WHERE ord.order_id = '170'

但是我想得到这样的数据

array (
  0 => 
  array(
     'order_id' => '170',
     'purchase_id' => '222',
     'purchase' => array(
         0 =>
         array(
             'purchase_id' => '222',
             'product_option_id' => '014',
         ),
         1 =>
         array(
             'purchase_id' => '600',
             'product_option_id' => '015',
         ),
      )
   )
)

如何使用PDO获取此类数据?

谢谢

2 个答案:

答案 0 :(得分:3)

幸运的是,you CAN have it with PDO

除了命令的id之外你还需要什么,任务是不可能的。

但只要你只需要订单中的唯一价值,你就可以得到这样的东西

array (
  170 => 
  array(
         0 =>
         array(
             'purchase_id' => '222',
             'product_option_id' => '014',
         ),
         1 =>
         array(
             'purchase_id' => '600',
             'product_option_id' => '015',
         ),
      )
   )
)

使用与

一样简单的代码
$sql = "your sql";
$pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);

但是,我发现获取用于过滤数据的相同订单ID的意义不大。可能应该是一些更接近您真实需求的其他查询?就像拿出几个订单的人一样?

答案 1 :(得分:1)

您无法通过PDO获得此功能,但您可以重新排列结果。可能的方法是使用array_reduce函数。

$orders = array_reduce($results, function ($carry, $item) {
    if (!isset($carry[$item->order_id])) {
        $carry[$item->order_id] = array(
            'order_id' => $item->order_id,
            'purchase' => array(array(
                'purchase_id' => $item->purchase_id,
                'product_option_id' => $item->product_option_id,
            ));
        );
    } else {
        $carry[$item->order_id]['purchase'][] = array(
           'purchase_id' => $item->purchase_id,
           'product_option_id' => $item->product_option_id,
        );
    }
    return $carry;
}, array());