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

69

Предположим, что мы используем построитель запросов Laravel:

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

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

really_long_table_name AS short_name

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

Теги:
eloquent
laravel-4

4 ответа

131
Лучший ответ

Laravel поддерживает псевдонимы на таблицах и столбцах с AS. Попробуйте

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

Посмотрите его в действии с помощью замечательного инструмента tinker

$ php artisan tinker
[1] > Schema::create('really_long_table_name', function($table) {$table->increments('id');});
// NULL
[2] > DB::table('really_long_table_name')->insert(['id' => null]);
// true
[3] > DB::table('really_long_table_name AS t')->select('t.id AS uid')->get();
// array(
//   0 => object(stdClass)(
//     'uid' => '1'
//   )
// )
  • 47
    Было бы полезно поместить это в документы.
  • 2
    @RubensMariuzzo я знаю. Я считаю, что вы можете оставить комментарий с просьбой на форумах laravel forums.laravel.io
Показать ещё 5 комментариев
33

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

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

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

  • 4
    Это не работает с мягким удалением.
  • 1
    @ m3rg Вы когда-нибудь находили способ заставить его работать с программным удалением? Сбой запроса с ошибкой Unknown column 'table_alias.deleted_at'
Показать ещё 3 комментария
0

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

$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 family_name', 'pf.id as family')
        ->orderBy('pr.id', 'desc')
        ->get();

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню