Префикс к AS при выборке из БД

Суть такова. Есть две таблиц с стандартными именами колонок (title, desc, state и тд). Есть ли способ при присоединении (join) данных из второй таблицы использовать краткую запись? Что то типа такого варианта:

$query->select( ' t.*, c.* as cat_* '); // где cat_ префикс для всех с.

Ответы (1 шт):

Автор решения: Егор Банин

В MySQL и PostgreSQL, насколько мне известно, так нельзя. Стандартный SQL ничего такого тоже не предусматривает.

Более того, считается плохой практикой не указывать явно то, что вы выбираете. База данных -- система внешняя по отношению к коду, независимая. Сегодня одни поля вернёт, завтра другие. А вы и не заметите сразу, что что-то пошло не так. Или выберете какой-нибудь блоб, а использовать его не будете -- зря гоняли данные. Это в теории.

На практике же вы скорее захотите получить строки как ассоциативные массивы и будете мапить обращаясь к данным по ключам. Если ключа нет, варнинг спровоцирует исключение, 500, тесты покраснеют, прод отстрельнёт вам в какой-нибудь сентри.

Поэтому очень часто используют эктиврекорды, датамаперы. У вас тут тоже какой-то кверибилдер, а значит можно понабилдить. Напишите свою первую ORM! :-)

<?php

class User {
    const TABLE = 'users';
    public $id;
    public $name;
}

function quoteName($name): string {
    return sprintf('`%s`', strtr($name, ['`' => '``']));
}

function table(string $class): string {
    return quoteName(constant("$class::TABLE"));
}

function alias(string $class, string $alias): string {
    $sql = [];
    foreach (get_class_vars($class) as $name => $value) {
        $sql[] = sprintf(
            '%s.%s as %s',
            table($class),
            quoteName($name),
            quoteName($alias . $name)
        );
    }

    return implode(', ', $sql);
}

echo alias(User::class, 'u_');

Но всё имеет свою цену. За скорость писания кода придётся заплатить производительностью. Поэтому это всё годится только для сайтов на потоке (сделал, деньги получил, следующий) или прототипов и эмвипи. Если вы разрабатываете серьёзное приложение, прикиньте, сколько времени вы потратите на написание запроса, а сколько времени будет потрачено на его выполнение миллионами пользователей.

→ Ссылка