【问题标题】:Trying to understand PDO and arrays试图理解 PDO 和数组
【发布时间】:2019-07-15 16:39:33
【问题描述】:

我正在尝试学习 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 数组匹配。

------------在下面编辑 --------- --

所以我仍在努力理解这一点。用户“你的常识”为我指明了正确的方向(我假设) 于是我去了他的网站,看了下例子(Example below)

$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 数组是空的……我不明白。

我在这里缺少什么?

【问题讨论】:

  • 如果您描述的表与您的查询中的列相匹配,它会有所帮助
  • child 表中是否有 2 行链接到此父级?
  • 我可能遗漏了一些巨大的东西,但是链接到这个父级是什么意思?我根据匹配的 id (parent_id = child.parent_id) 加入 2 个表
  • 对不起家长阅读main
  • 你能详细说明一下吗?或者也许将我指向涵盖此内容的正确文档

标签: php arrays pdo


【解决方案1】:

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

虽然 PDO 可以使用PDO::FETCH_GROUP fetch 修饰符模拟嵌套结构,但它只会从父表中获取一个字段,这不适合您。

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

当然它也可以通过 JOIN 来完成,但它需要一些后期处理,因为它会返回大量重复的数据。

为了使这个答案完整,有一种方法可以直接从查询中获得这样的结构。为此,您将需要一个高级的 ORM,例如 Doctrine。在那里,您首先定义表和它们之间的关系,它将根据这些定义为您提供这样的结构。虽然有一个学习曲线。

【讨论】:

  • 嗨,谢谢你的信息,你能给我一个例子,说明如何使用 2 个查询来填充数组吗?
  • 鉴于此代码可能对许多人有用,我在我的网站上写了一篇文章,其中包含示例 Getting a nested array when multiple rows are linked to a single entry
  • 我检查了你的链接,并在那里复制了你的代码,但是结果数组是空的?我评论了,但是 cmets 没有出现?
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2021-12-28
  • 2020-04-28
  • 2022-07-21
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多