Как создать псевдоним таблицы в запросах Laravel Eloquent (или с помощью Query Builder)?


147

Допустим, мы используем построитель запросов Laravel:

$users = DB::table('really_long_table_name')
           ->select('really_long_table_name.id')
           ->get();

Я ищу эквивалент этого SQL:

really_long_table_name AS short_name

Это было бы особенно полезно, когда мне нужно набрать много селекторов и типов (или, как правило, я включаю псевдоним в псевдоним столбца выбора, и он используется в массиве результатов). Без каких-либо псевдонимов таблиц для меня гораздо больше печатать, и все становится менее читабельным. Не можете найти ответ в документах Laravel, какие-либо идеи?

Ответы:


218

Laravel поддерживает псевдонимы таблиц и столбцов с помощью AS. Пытаться

$users = DB::table('really_long_table_name AS t')
           ->select('t.id AS uid')
           ->get();

Давайте посмотрим это в действии с удивительным tinkerинструментом

$ php ремесленник тинкер
[1]> Schema :: create («действительно_длинное_имя_таблицы», функция ($ таблица) {$ таблица-> приращения («идентификатор»);});
// НОЛЬ
[2]> DB :: table («действительно_длинное_имя_таблицы») -> вставить (['id' => ноль]);
// правда
[3]> DB :: table («действительно_long_table_name AS t») -> выбрать («t.id AS uid») -> get ();
// массив (
// 0 => объект (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo я знаю. Я полагаю, что вы можете оставить комментарий с просьбой на форумах laravel forums.laravel.io
peterm

2
@AldiUnanto А как насчет Eloquent? Активная запись предназначена для использования в одной таблице, поэтому вам не нужны псевдонимы. Когда вы используете отношения, вы по-прежнему имеете дело с одной таблицей за раз (т.е. когда вы определяете фильтры для отношений). Теперь, если вы используете Query Builder с моделью Eloquent (например, объединением), вы можете использовать псевдонимы для всех соединенных таблиц, кроме таблицы моделей.
peterm

1
@peterm, что если я использую построитель запросов в eloquent? Я имею в виду, что красноречивой модели необходимо объявить защищенное свойство для имени таблицы (например protected $table = "books";), тогда как я могу создать псевдонимы? (например , генерируемый SQL: ... FROM books AS A ...)
Aldi Unanto

Вы могли бы сделать, protected $table = 'really_long_table_name AS short_name';но это не сработает на вставках, хотя. Также может нарушить отношения запросов. Я использую Lumen и шаблон DDD / Repository, чтобы полностью избежать Eloquent.
программер

@peterm Я также застрял с псевдонимом Eloquent. Вы нашли что-нибудь с Eloquent?
Лизеш Шакья

77

Чтобы использовать псевдонимы в красноречивых моделях, измените ваш код следующим образом:

Item
    ::from( 'items as items_alias' )
    ->join( 'attachments as att', DB::raw( 'att.item_id' ), '=', DB::raw( 'items_alias.id' ) )
    ->select( DB::raw( 'items_alias.*' ) )
    ->get();

Это автоматически добавит префикс таблицы к именам таблиц и вернет экземпляр Itemsмодели. не голый результат запроса. Добавление не DB::rawпозволяет laravel добавлять префиксы таблиц к псевдонимам.


1
@ m3rg Вы когда-нибудь находили способ заставить его работать с программным удалением? запрос завершается с ошибкойUnknown column 'table_alias.deleted_at'
dev7

как насчет этой ситуации? ВЫБЕРИТЕ * ИЗ fx_bank КАК ПРАВО НАРУЖНОГО ФАЙЛА fx_ex_keys AS b на b.bank_id = a.id AND a.agent_type = 2 ГДЕ b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk Используйте DB :: raw везде для нацеливания псевдонимов таблиц. другие методы Laravel используются как обычно
AMIB

@ m3rg @Yani, я использую это ->withTrashed()и->whereNull('table_alias.deleted_at')
Firman Hidayat

8

Вот как это можно сделать. Я приведу пример с присоединением, чтобы кому-то стало супер ясно.

$products = DB::table('products AS pr')
        ->leftJoin('product_families AS pf', 'pf.id', '=', 'pr.product_family_id')
        ->select('pr.id as id', 'pf.name as product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

Надеюсь это поможет.


Можете ли вы привести пример, в котором псевдоним имеет пробел вместо подчеркивания (_)?
Channox

7

Использовать в Eloquent. Добавьте поверх вашей модели

protected $table = 'table_name as alias'

// имя_таблицы должно быть точно таким же, как в вашей базе данных

..то использовать в вашем запросе, как

ModelName::query()->select(alias.id, alias.name)


1
Laravel eloquent очень плохой дизайн, псевдоним, который вы определили выше, отлично подходит для запроса операции, но обновление и удаление приведут к ошибке из-за вашего псевдонима.
Мероприятие

1

Вы можете использовать меньше кода, написав это:

    $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name'));

И, конечно, если вы хотите выбрать больше полей, просто напишите «,» и добавьте еще:

 $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name', 'really_long_table_name.another_field as other', 'and_another'));

Это очень удобно, когда вы используете сложный запрос


0

То же, что и ответ AMIB, для ошибки мягкого удаления "Неизвестный столбец 'table_alias.deleted_at'", просто добавьте, а ->withTrashed()затем обработайте его как->whereRaw('items_alias.deleted_at IS NULL')

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.