Префикс к 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_');
Но всё имеет свою цену. За скорость писания кода придётся заплатить производительностью. Поэтому это всё годится только для сайтов на потоке (сделал, деньги получил, следующий) или прототипов и эмвипи. Если вы разрабатываете серьёзное приложение, прикиньте, сколько времени вы потратите на написание запроса, а сколько времени будет потрачено на его выполнение миллионами пользователей.