【发布时间】:2021-06-07 05:38:10
【问题描述】:
我有一个数据库,其中包含两个具有 1:n 关系的表(订单和订单产品)。 我想将这两个表结合起来,为我的 REST-Tool 提供一个 JSON。
为此,我有以下 SQL 查询:
$sqlQueryAll = "SELECT
t1.id,
t1.name,
t2.pId,
t2.anzahl,
t2.name as pName,
t2.preis,
FROM orders as t1
JOIN orderProducts as t2 ON t1.id = t2.orderId
WHERE t1.id <= ?";
在这里我会取回这个数组:
Array
(
[0] => Array(
[id] => 1000
[name] => Nurten
[pId] => 26
[anzahl] => 1
[pName] => Fitness-Teller
[preis] => 12.90
)
[1] => Array(
[id] => 1001
[name] => Kutscha
[pId] => 94
[anzahl] => 1
[pName] => Pizza Parma
[preis] => 12.90
)
[2] => Array(
[id] => 1001
[name] => Kutscha
[pId] => 75
[anzahl] => 1
[pName] => Pizza Margherita
[preis] => 6.50
)
)
我想要以下 JSON:
Array (
[0] => Array (
[id] => 1000
[name] => Nurten
[products] => Array(
[0] => Array(
[pId] => 26
[anzahl] => 1
[pName] => Fitness-Teller
[preis] => 12.90
)
)
)
[1] => Array (
[id] => 1001
[name] => Kutscha
[products] => Array(
[0] => Array(
[pId] => 94
[anzahl] => 1
[pName] => Pizza Parma
[preis] => 12.90
)
[1] => Array(
[pId] => 75
[anzahl] => 1
[pName] => Pizza Margherita
[preis] => 6.50
)
)
)
)
为此,我正在使用以下工作 PHP 代码:
$artikelFields = ['pId', 'anzahl', 'pName', 'preis'];
$id_=""; #new Product Kenner
$orders = [];
$i = -1;
foreach ($result2 as $row) {
if ($row['id'] != $id_) {
# reset
$i++;
unset($order);
$id_ = $row['id'];
# write Array from Fields without $artikelFields
foreach ($row as $field =>$value) {
if (!in_array($field, $artikelFields)) {
$order[$field] = $value;
}
}
# write Artikel to array[products]
$newArtikel = array();
foreach ($artikelFields as $a) {
$newArtikel[$a] = $row[$a];
}
$order['products'][] = $newArtikel;
} else {
# write only array[products]
$newArtikel = array();
foreach ($artikelFields as $a) {
$newArtikel[$a] = $row[$a];
}
$order['products'][] = $newArtikel;
}
$orders[$i] = $order;
} /* !foreach */
我有点不放心,为什么这看起来很复杂。没有更方便的方法来实现这一点吗? (可能还有其他查询)。
【问题讨论】:
-
查询无法生成嵌套数组,因此您必须自己以一种或另一种方式重构结果。话虽如此,您正在寻求改进的工作解决方案将更适合Code review。
-
为什么认为这段代码很复杂?是否存在任何性能问题,或者您是否遇到代码产生错误输出的情况?