试图了解PDO和阵列

时间:2019-07-15 16:39:33

标签: php arrays pdo

我正在尝试学习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数组为空,但是...我不明白。

我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

首先要了解的是,您无法从数据库中获取嵌套结构。返回的数据始终是一个矩形表。

尽管PDO可以使用PDO::FETCH_GROUP fetch修饰符来模拟嵌套结构,但是它将仅从父表中获取一个不适合您的字段。

最简单的解决方案是运行两个查询。第一个从主表中获取数据,第二个从子表中获取相关项。那么您可以将第二个结果分配给主表结果的新字段。

当然也可以用JOIN来完成,但是它需要一些后处理,因为它将返回很多重复的数据。

要使此答案完整,有一种方法可以使查询结构像这样。为此,您将需要一个高级ORM,例如Doctrine。在这里,您首先定义表及其之间的关系,然后将根据这些定义为您提供这种结构。虽然有一个学习曲线。