我正在尝试学习PDO和PHP。 假设我有一个像下面这样的数组:
$_var1 = [
'key' => [
'title' => 'Title',
'icon' => 'icon1',
'items' => [
'set1' => [
'title' => 'Subtitle1',
'url' => 'url'
],
'set2' => [
'title' => 'Subtitle 2',
'url' => 'url'
]
]
],
];
我正试图将其围绕SQL db的外观以及如何通过PDO从SQL读回。
我尝试创建2个表;父母和子女;
PARENT
id (ai)
nav_key varchar(256) utf8mb4_general_ci
title varchar(256) utf8mb4_general_ci
icon varchar(256) utf8mb4_general_ci
item varchar(256) utf8mb4_general_ci
CHILD
id (ai)
parent_id varchar(256) utf8mb4_general_ci
set varchar(256) utf8mb4_general_ci
title2 varchar(256) utf8mb4_general_ci
url varchar(256) utf8mb4_general_ci
SELECT parent.nav_key, parent.title, parent.icon, parent.item,
child.set, child.title2, child.url
FROM parent
JOIN child on parent.id = child.parent_id
Array (
[0] => Array
( [nav_key] =>
[title] => test1
[icon] => icon1
[item] =>
[set] =>
[title2] => sub1
[url] => suburl
)
)
看起来很近,但是我被卡住了........
我正在尝试获取查询的输出以匹配PHP数组。
------------------------编辑如下--------------------- -
所以我仍在努力理解这一点。用户“您的常识”已经向我指出了正确的方向(我认为) 因此,我去了他的网站,并查看了示例(下面的示例)
$sql = "SELECT c.id as c_id, c.name as c_name, c.url,
p.id as p_id, p.name as p_name, p.price
FROM category c
JOIN product p ON p.category_id=c.id
ORDER BY c.name, p.name
LIMIT ?,?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$start, $limit]);
$data = [];
while ($row = $stmt->fetch()) {
if (!isset($data[$row['c_id']])) {
$row['c_id'] = [
'name' => $row['c_name'],
'url' => $row['url'],
'products' => [
[
'id' => $row['p_id'],
'name' => $row['p_name'],
'price' => $row['price'],
],
],
];
} else {
$row['c_id']['products'][] = [
'id' => $row['p_id'],
'name' => $row['p_name'],
'price' => $row['price'],
];
}
}
这应该创建一个与我正在谈论的数组类似的数组。 但是,如果我复制此代码并创建数据库,它将无法正常工作。
我做了数据库,我看到查询在mysql命令行上运行。
如果我print_r($stmt)
看到正确的查询,如果我手动将查询输入SQL并返回值,则$ data数组为空,但是...我不明白。
我在这里想念什么?
答案 0 :(得分:3)
首先要了解的是,您无法从数据库中获取嵌套结构。返回的数据始终是一个矩形表。
尽管PDO可以使用PDO::FETCH_GROUP fetch修饰符来模拟嵌套结构,但是它将仅从父表中获取一个不适合您的字段。
最简单的解决方案是运行两个查询。第一个从主表中获取数据,第二个从子表中获取相关项。那么您可以将第二个结果分配给主表结果的新字段。
当然也可以用JOIN来完成,但是它需要一些后处理,因为它将返回很多重复的数据。
要使此答案完整,有一种方法可以使查询结构像这样。为此,您将需要一个高级ORM,例如Doctrine。在这里,您首先定义表及其之间的关系,然后将根据这些定义为您提供这种结构。虽然有一个学习曲线。