fetch SQL-join-statement without alias in PHP

fetch SQL-join-statement without alias in PHP

按照我的代码:

$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 提到的,可以提高效率,因为没有必要在每个循环中检查列名,因为它们不会改变。

谢谢大家。

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

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

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' ].

您可能希望通过仅遍历元信息一次来提高我的示例的效率,因为每列的 table 名称不会逐行更改。

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