不明确的字段名/使用 FETCH_OBJ 添加表名
Posted
技术标签:
【中文标题】不明确的字段名/使用 FETCH_OBJ 添加表名【英文标题】:Ambiguous field names / add table name with FETCH_OBJ 【发布时间】:2014-08-12 07:48:00 【问题描述】:我有一个表 T1,其中有 2 个外键指向同一个表 T2。
所以,我的 SQL 语句是这样的:
SELECT *
FROM T1
INNER JOIN T2 AAA ON AAA.ID = T1.ID1
INNER JOIN T2 BBB ON BBB.ID = T1.ID2
(此 sql 有效)
然后,我使用$info = $exec->fetch(PDO::FETCH_ASSOC);
最后,我想使用 $info->AAA.name
和 $info->BBB.name
,
但我找不到如何将表名设置为读数。我会
喜欢通过添加十几个 ... AS ... 来避免更改我的 SQL
有什么想法吗?
【问题讨论】:
【参考方案1】:更新1
我搜索了 PDO 文档并找到了指令PDO::ATTR_FETCH_TABLE_NAMES
。文档说它使驱动程序在列名之前返回表名。表名将通过 '.'(dot) 与列名分隔。您可以尝试使用此指令来解决您的问题,但如果没有别名,它可能无法工作。.
请试穿:$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);
更新2 我从提问者那里找到了以下问题和答案,他们使用此指令解决了他的问题,类似于你的问题。SELECT result with table names for columns
这个问题重复了之前提出的其他几个问题:PDO: fetchAll() with duplicate column name on JOIN PDO Auto-aliasing when fetching?
所以,第一个答案是:“不,如果不为每列设置别名,您将无法做到这一点。”
解决方法是使用PDO::FETCH_NUM
,它将返回一个已获取列的编号数组。但我不推荐它,因为如果你改变表的结构,你的 php 脚本可能会损坏。
无论如何,选择某些列并设置别名而不是所有*
仍然是一个好习惯。像这样:
SELECT T1.ID1 as ID1, T1.ID2 as ID2, T1.name as T1_name, AAA.name as AAA_name, BBB.ID as BBB_name
FROM
T1
INNER JOIN
T2 AAA
ON AAA.ID = T1.ID1
INNER JOIN
T2 BBB
ON BBB.ID = T1.ID2
【讨论】:
以上是关于不明确的字段名/使用 FETCH_OBJ 添加表名的主要内容,如果未能解决你的问题,请参考以下文章