首页 > 解决方案 > 在 PHP 中获取没有别名的 SQL 连接语句

问题描述

按照我的代码:

$list = $pdo->prepare("SELECT * FROM table_a INNER JOIN table_b ON table_a.id = table_b.blabla_id");
$list_result = $list->execute();
while($element = $list->fetch()) {
    //CONTENT
}

现在我想用类似的东西来获取列echo $element['table_a.id'];- 这是行不通的。我不想为每一列都写一个别名。有没有办法解决这个问题?:)

解决方案:

$list = $pdo->prepare("SELECT * FROM table_a INNER JOIN table_b ON table_a.id = table_b.blabla_id");
$list->execute();
while($element = $list->fetch(PDO::FETCH_ASSOC)) {
    $a = [];
    $i = 0;
    foreach ( $element as $k => $v ) {
        $meta = $list->getColumnMeta($i);
        $a[ $meta['table'] . '.' . $k ] = $v;
        $i++;
    }
    echo $a['table_b.blabla'];
}

正如 kmoser 所提到的,可以提高效率,因为没有必要在每个循环中检查列名,因为它们不会改变。

谢谢大家。

标签: phpsqljoinalias

解决方案


$list->fetch()通过将调用更改为 来修复调用后$list_result->fetch(),您可以使用它$list_result->getColumnMeta($i)来获取 position 列的元信息(包括表名)$i,其中$i是结果集中的 0 索引列。

然后,您可以遍历列,检索它们的表名,并使用更新的键和原始数组中的值填充新数组:

while($element = $list->fetch()) {
    $a = []; // New array
    $i = 0;
    foreach ( $element as $k => $v ) { // For each element in the fetched row
        $meta = $list_result->getColumnMeta($i); // Get the meta info for column $i
        $a[ $meta->table . '.' . $k ] = $v; // E.g. $a[ 'table_a.id' ] = 'Foo'
        $i++; // Point to next column
    }
    $element = $a; // If you really need this variable name
}

现在您可以使用$element[ 'table_a.id' ].

您可能希望通过仅循环一次元信息来使我的示例更有效,因为每列的表名不会因行而异。

有关更多信息,请参阅https://www.php.net/manual/en/pdostatement.getcolumnmeta.php


推荐阅读