不明确的字段名称/使用FETCH_OBJ添加表名

时间:2014-08-12 07:48:01

标签: mysql pdo field-names

我有一张带有2个外键的表T1,目标是同一个表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 个答案:

答案 0 :(得分:3)

<强> UPDATE1
我搜索了PDO文档并找到了指令PDO::ATTR_FETCH_TABLE_NAMES。 Docs说它使驱动程序在列名之前返回表名。表名将通过&#39;(&em; dot )与列名分开。
您可以尝试使用此指令来解决您的问题,但也许它不会没有别名的工作..
请尝试:$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);

<强> UPDATE2
我找到了以下问答人员,他们使用这个指令来解决他的问题,类似于你 SELECT result with table names for columns


这个问题与前面提到的其他几个问题相同:
PDO: fetchAll() with duplicate column name on JOIN
PDO Auto-aliasing when fetching?

所以,第一个答案是:&#34; NO ,如果不为每列设置别名,就不能这样做。&#34;

解决方法是使用PDO::FETCH_NUM,它将返回已编号的已获取列数组。但我不会推荐它,因为如果你改变你的桌子&#39;结构,你的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