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

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

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

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

really_long_table_name AS short_name

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

11 ответов

Решение

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("действительно_long_table_name")-> вставить (['id' => ноль]);
// правда
[3] > DB::table("действительно_long_table_name AS t")-> выбрать ("t.id AS uid")->get();
// массив (
//   0 => объект (stdClass)(
//     'uid' => '1'
//)
//)

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

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 добавлять префиксы таблиц к псевдонимам.

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

$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();

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

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

protected $table = 'table_name as alias'

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

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

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

Я пробовал все эти варианты, и ни один не работает для меня. Затем я нашел в документации Laravel кое-что, что действительно работает.

Вы можете попробовать это:

      DB::table('table_one as t1')
    ->select(
        't1.field_id as id','t2.field_on_t2 as field'
     )->join('table_two as t2', function ($join) {
        $join->on('t1.field_id ', '=', 't2.field_id');
    })->get()

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

    $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'));

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

Вы можете использовать псевдонимы таблиц, используя Eloquent Models, как показано ниже:

      $myTable = app(MyModel::class)->getTable();
$table2 = app(Model2::class)->getTable();
$record = MyModel::from("{$myTable} as t1")
->join("{$table2} as t2", 't1.email', '=', 't2.email', 'left')
->select(t1.*,t2.name)->first();

Также обратите внимание, что вы можете передать псевдоним в качестве второго параметра табличного метода при использовании фасада БД:

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

Не уверен, появилась ли эта функция с определенной версией Laravel или она всегда была встроена.

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

      YourModel::select(['user_id as my_id','created_at as my_date'])->get();

В последней версии Laravel 9 вы можете использовать псевдоним для столбца как:

      $events = Booking::whereBetween('sessionDateTime', [$today, $nextMonth])->get(['bookings.sessionDateTime as start']); // start is an alias here
Другие вопросы по тегам