Come alias una tabella nelle query Eloquent di Laravel (o usando Query Builder)?


147

Diciamo che stiamo usando il generatore di query di Laravel:

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

Sto cercando un equivalente a questo SQL:

really_long_table_name AS short_name

Ciò sarebbe particolarmente utile quando devo digitare un sacco di selezioni e dove (o in genere includo anche l'alias nell'alias di colonna della selezione e viene usato nella matrice dei risultati). Senza alias di tabella c'è molto più digitazione per me e tutto diventa molto meno leggibile. Non trovi la risposta nei documenti di laravel, qualche idea?

Risposte:


218

Laravel supporta gli alias su tabelle e colonne con AS. Provare

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

Vediamolo in azione con uno tinkerstrumento fantastico

Armeggiatore artigianale $ php
[1]> Schema :: create ('really_long_table_name', funzione ($ table) {$ table-> increments ('id');});
// NULLO
[2]> DB :: table ('really_long_table_name') -> insert (['id' => null]);
// vero
[3]> DB :: table ('really_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// Vettore(
// 0 => object (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo Lo so. Credo che puoi lasciare un commento con richiesta nei forum laravel forums.laravel.io
peterm,

2
@AldiUnanto Che ne dici di Eloquent? Record attivo pensato per essere utilizzato su una tabella quindi non hai bisogno di alias. Quando usi le relazioni hai ancora a che fare con una tabella alla volta (cioè quando definisci i filtri sulla relazione). Ora se si utilizza Query Builder con un modello Eloquent (ovvero join), è possibile utilizzare gli alias su tutte le tabelle unite, ma la tabella del modello.
peterm,

1
@peterm cosa succede se utilizzo query builder in eloquent? Voglio dire, il modello eloquente deve dichiarare una proprietà protetta per il nome della tabella (ad es. protected $table = "books";), Quindi come posso creare un alias? (sql per esempio generato: ... FROM books AS A ...)
Aldi Unanto

Potresti farlo, protected $table = 'really_long_table_name AS short_name';ma ciò fallirebbe negli INSERT. Inoltre potrebbe interrompere le query sulle relazioni. Sto usando Lumen e un modello DDD / Repository per evitare completamente Eloquent.
prograhammer,

@peterm Sono anche bloccato con alias eloquente. Hai trovato qualcosa con Eloquent?
Lizesh Shakya,

77

Per utilizzare gli alias su modelli eloquenti, modifica il codice in questo modo:

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

Ciò aggiungerà automaticamente il prefisso della tabella ai nomi delle tabelle e restituirà un'istanza del Itemsmodello. non un risultato di query semplice. L'aggiunta DB::rawimpedisce a laravel di aggiungere prefissi di tabella agli alias.


1
@ m3rg hai mai trovato un modo per farlo funzionare con l'eliminazione soft? la query ha esito negativo con erroreUnknown column 'table_alias.deleted_at'
dev7

che ne dici di questa situazione? SELEZIONA * DA fx_bank COME UN GIUSTO ESTERNO UNISCI fx_ex_keys AS b su b.bank_id = a.id AND a.agent_type = 2 DOVE b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk Usa DB :: raw ovunque per indirizzare gli alias di tabella. altri metodi Laravel sono usati normalmente
AMIB

@ m3rg @Yani io uso questo ->withTrashed()e->whereNull('table_alias.deleted_at')
Firman Hidayat il

8

Ecco come si può fare. Farò un esempio con l'adesione in modo che diventi super chiaro per qualcuno.

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

Spero che questo ti aiuti.


Puoi fornire un esempio in cui l'alias ha spazi bianchi invece di trattino basso (_)?
Channox,

7

Da usare in Eloquent. Aggiungi sopra il tuo modello

protected $table = 'table_name as alias'

// table_name dovrebbe essere esatto come nel tuo database

.. quindi utilizzare nella query come

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


1
Laravel eloquente design molto scadente, alias definito sopra per la query operativa, ma l'aggiornamento e l'eliminazione causeranno errori a causa del tuo alias.
Misura il

1

Puoi usare meno codice, scrivendo questo:

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

E ovviamente se vuoi selezionare più campi, basta scrivere un "," e aggiungere altro:

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

Ciò è molto pratico quando si utilizza una query complessa join


0

Come per la risposta AMIB, per l'errore di eliminazione graduale "Colonna sconosciuta 'table_alias.deleted_at'", basta aggiungere ->withTrashed()quindi gestirla come->whereRaw('items_alias.deleted_at IS NULL')

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.