Jak aliasować tabelę w zapytaniach Laravel Eloquent (lub używając Query Builder)?

147

Powiedzmy, że używamy kreatora zapytań Laravel:

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

Szukam odpowiednika tego SQL:

really_long_table_name AS short_name

Byłoby to szczególnie pomocne, gdy muszę wpisać wiele elementów typu select i wheres (lub zazwyczaj umieszczam alias w aliasie kolumny elementu select, który jest używany w tablicy wyników). Bez aliasów tabel jest dużo więcej pisania i wszystko staje się dużo mniej czytelne. Nie możesz znaleźć odpowiedzi w dokumentacji laravel, żadnych pomysłów?

prograhammer
źródło

Odpowiedzi:

218

Laravel obsługuje aliasy w tabelach i kolumnach z AS. Próbować

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

Zobaczmy to w akcji dzięki niesamowitemu tinkernarzędziu

$ php rzemieślnik majstrować
[1]> Schemat :: create ('really_long_table_name', function ($ table) {$ table-> inkrements ('id');});
// ZERO
[2]> DB :: table ('really_long_table_name') -> insert (['id' => null]);
// prawdziwe
[3]> DB :: table ('really_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// tablica (
// 0 => object (stdClass) (
// 'uid' => '1'
//)
//)
peterm
źródło
2
@RubensMariuzzo Wiem. Myślę, że możesz zostawić komentarz z prośbą na forach laravel forums.laravel.io
peterm
2
@AldiUnanto A co z Eloquent? Rekord aktywny przeznaczony do użycia na jednej tabeli, dlatego nie potrzebujesz aliasów. Kiedy używasz relacji, nadal masz do czynienia z jedną tabelą naraz (tj. Kiedy definiujesz filtry w relacji). Teraz, jeśli używasz Query Builder z modelem elokwentnym (tj. Łączenie), możesz używać aliasów we wszystkich połączonych tabelach, ale tabela modelu.
peterm
1
@peterm co jeśli użyję konstruktora zapytań w elokwentnym? Mam na myśli wymowny model, który musi zadeklarować chronioną właściwość dla nazwy tabeli (np. protected $table = "books";), Więc jak mogę zrobić aliasy? (np generowane SQL: ... FROM books AS A ...)
Aldi Unanto
Mógłbyś to zrobić, protected $table = 'really_long_table_name AS short_name';ale to by się nie udało na INSERTach. Może również zepsuć zapytania dotyczące relacji. Używam Lumen i wzorca DDD / Repository, aby całkowicie uniknąć Eloquent.
prograhammer
@peterm Również utknąłem z elokwentnym aliasem. Znalazłeś coś w Eloquent?
Lizesh Shakya
77

Aby używać aliasów w modelach elokwentnych, zmodyfikuj swój kod w następujący sposób:

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

Spowoduje to automatyczne dodanie przedrostka tabeli do nazw tabel i zwrócenie instancji Itemsmodelu. nie jest to czysty wynik zapytania. Dodanie DB::rawzapobiega dodawaniu przedrostków tabel do aliasów przez laravel.

AMIB
źródło
1
@ m3rg Czy kiedykolwiek znalazłeś sposób, aby to działało z miękkim usuwaniem? zapytanie kończy się niepowodzeniem z błędemUnknown column 'table_alias.deleted_at'
dev7
jak z tą sytuacją? WYBIERZ * Z fx_bank JAKO PRAWO ZEWNĘTRZNE DOŁĄCZ fx_ex_keys AS b on b.bank_id = a.id AND a.agent_type = 2 GDZIE b.status = 1 AND b.group = -1;
GFxJamal
@jRhesk Użyj DB :: raw wszędzie, aby wskazać aliasy tabel. inne metody Laravel są używane normalnie
AMIB
@ m3rg @Yani używam tego ->withTrashed()i->whereNull('table_alias.deleted_at')
Firman Hidayat
8

Oto, jak można to zrobić. Podam przykład z dołączaniem, aby stało się to dla kogoś bardzo jasne.

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

Mam nadzieję że to pomoże.

Koushik Das
źródło
Czy możesz podać przykład, w którym alias ma białe znaki zamiast podkreślenia (_)?
Channox
7

Do użycia w wymowie. Dodaj górę swojego modelu

protected $table = 'table_name as alias'

// nazwa_tabeli powinna być taka sama, jak w Twojej bazie danych

..następnie użyj w zapytaniu, na przykład

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

muinh
źródło
1
Laravel elokwentny, bardzo słaby projekt, alias, który zdefiniowałeś powyżej dobrze dla zapytania operacji, ale aktualizacja i usuwanie spowodują błąd, ponieważ twój alias.
Środa
1

Możesz użyć mniej kodu, pisząc to:

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

Oczywiście, jeśli chcesz wybrać więcej pól, po prostu wpisz „,” i dodaj więcej:

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

Jest to bardzo praktyczne, gdy używasz złożonego zapytania sprzężenia

Carlos h Gonzalez
źródło
0

Tak samo jak odpowiedź AMIB, dla błędu usuwania nietrwałego "Nieznana kolumna 'table_alias.deleted_at'", po prostu dodaj ->withTrashed()i obsłuż to samodzielnie, jak->whereRaw('items_alias.deleted_at IS NULL')

Ahmed Gamal
źródło