【问题标题】:PDO Join, avoid overwriting keys with the same name in the resulted arrayPDO Join,避免覆盖结果数组中同名的键
【发布时间】:2023-04-06 11:17:02
【问题描述】:

我正在像这样加入 PDO:

SELECT users.*,images.*, sessions.*,social.*,videos.*,teams.*,achievements.*,_achievements_list.* FROM users LEFT JOIN images ON users.user_id=images.user_id LEFT JOIN sessions ON users.user_id=sessions.user_id LEFT JOIN social ON users.user_id=social.user_id LEFT JOIN videos ON users.user_id=videos.user_id LEFT JOIN teams ON users.user_id=teams.user_id LEFT JOIN achievements ON users.user_id=achievements.user_id LEFT JOIN _achievements_list ON achievements.achievement_id=_achievements_list.parent_id WHERE users.nickname = 'something'

问题是某些表的某些列具有相同的名称,所以在 PDO 给我返回的数组中,很多东西都被覆盖了。

我正在使用这个:

   $statement = $this->pdo->prepare($query);

    if ($statement->execute($param))
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    return false;

PDO 返回一个关联数组,但我该如何做才能避免覆盖来自不同表的同名列?

【问题讨论】:

  • 使用 FETCH_ALL 而不是 FETCH_ASSOC,我认为您将拥有一切(两次:一次按数字,一次按列名)
  • 一周前完全相同的问题:stackoverflow.com/q/17715049/285587
  • 另一种方法是对所有这些表进行不同的查询。

标签: arrays pdo


【解决方案1】:

你可以使用PDO::FETCH_NAMED,见https://phpdelusions.net/pdo/fetch_modes#FETCH_NAMED

【讨论】:

    【解决方案2】:
    • 非常不推荐使用.*,因为:

      1. 如果表结构变了,那你的列索引就变了,如果你以前是按索引读的,那就太糟糕了。

      2. 大多数情况下,您确实不需要所有列,因此您将减少从服务器检索的数据量(如果它是远程的,那么它甚至可能是有意义的)

    无论如何,如果您不使用 .*,您可以在 SQL 查询中使用别名 喜欢

    SELECT products.id prodId, orders.id orderId FROM Orders LEFT JOIN Products ON (prodId = orders.product_id) WHERE orderId = @oid
    

    【讨论】:

    • 你能澄清一下(1)吗?这似乎与我相反——即使列索引发生变化,也无需重写查询。它有什么问题?
    • 请考虑查询 Select * from myTable where MyTable: ID,fldA,FldB,FldC using myRecord[2]
    • 在 PHP 中,我们通常通过名称而不是位置来寻址字段。所以,这不是问题。
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2022-12-12
    • 2013-06-02
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多