it-roy-ru.com

Как создать псевдоним таблицы в запросах 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, какие-либо идеи?

97
prograhammer

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

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

Давайте посмотрим на это с помощью потрясающего инструмента tinker

 $ php ремесленник тинкер 
 [1] > Schema :: create ('действительно_long_table_name', функция ($ table) {$ table-> increments ('id');}); 
 // NULL 
 [2] > DB :: table ('действительно_long_table_name') -> вставка (['id' => null]); 
 // true 
 [3] > DB :: table ('действительно_long_table_name AS t') -> выберите ('t.id AS uid') -> get (); 
 // массив (
 // 0 => объект (stdClass) ( 
 // 'uid' => '1' 
 //) 
 //) 
157
peterm

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

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

47
AMIB

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

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

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

3
Koushik Das

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

protected $table = 'table_name as alias'

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

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

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

2
muinh

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

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

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

1
Carlos h Gonzalez

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

0
Ahmed Gamal