получить SQL -соединение-оператор без псевдонима в PHP - PullRequest
0 голосов
/ 13 апреля 2020

После моего кода:

$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, можно улучшить эффективность, так как нет необходимости проверять имена столбцов каждые l oop поскольку они не меняются.

Спасибо всем.

1 Ответ

1 голос
/ 14 апреля 2020

После того, как вы исправили свой вызов на $list->fetch(), изменив его на $list_result->fetch(), вы можете использовать $list_result->getColumnMeta($i) для получения метаинформации (включая имя таблицы) столбца в позиции $i, где $i - это столбец с 0 индексами в наборе результатов.

Затем вы можете l oop просмотреть столбцы, получить имена их таблиц и заполнить новый массив обновленными ключами и значениями из исходного массива:

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 для получения дополнительной информации.

...