Wie kann man eine Tabelle in Laravel Eloquent-Abfragen aliasisieren (oder Query Builder verwenden)?


147

Nehmen wir an, wir verwenden den Abfrage-Generator von Laravel:

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

Ich suche nach einem Äquivalent zu diesem SQL:

really_long_table_name AS short_name

Dies ist besonders hilfreich, wenn ich viele Auswahlen und Orte eingeben muss (oder normalerweise füge ich den Alias ​​auch in den Spaltenalias der Auswahl ein und er wird im Ergebnisarray verwendet). Ohne Tabellen-Aliase gibt es für mich viel mehr Tippen und alles wird viel weniger lesbar. Können Sie die Antwort in den Laravel-Dokumenten nicht finden, irgendwelche Ideen?

Antworten:


217

Laravel unterstützt Aliase für Tabellen und Spalten mit AS. Versuchen

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

Lassen Sie es uns in Aktion mit einem fantastischen sehen tinker Tool

$ php Handwerker basteln
[1]> Schema :: create ('wirklich_langer_Tabellenname', Funktion ($ table) {$ table-> Inkremente ('id');});
// NULL
[2]> DB :: table ('wirklich_long_table_name') -> insert (['id' => null]);
// wahr
[3]> DB :: table ('wirklich_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// array (
// 0 => Objekt (stdClass) (
// 'uid' => '1'
//)
//)

2
@ RubensMariuzzo Ich weiß. Ich glaube, Sie können einen Kommentar mit Anfrage in Laravel Foren forums.laravel.io
Peterm

2
@AldiUnanto Was ist mit Eloquent? Aktiver Datensatz, der für eine Tabelle verwendet werden soll, daher benötigen Sie keine Aliase. Wenn Sie Relationen verwenden, haben Sie immer noch mit jeweils einer Tabelle zu tun (dh wenn Sie Filter für die Beziehung definieren). Wenn Sie Query Builder mit einem eloquenten Modell (dh Join) verwenden, können Sie Aliase für alle verknüpften Tabellen außer der Modelltabelle verwenden.
Peterm

1
@peterm was ist, wenn ich den Abfrage-Generator in eloquent verwende? Ich meine, eloquente Modelle müssen eine geschützte Eigenschaft für den Tabellennamen deklarieren (z. B. protected $table = "books";). Wie kann ich dann Aliase erstellen? (zB generierten SQL: ... FROM books AS A ...)
Aldi Unanto

Sie könnten es tun, protected $table = 'really_long_table_name AS short_name';aber das würde bei INSERTs allerdings fehlschlagen. Kann auch Beziehungsabfragen unterbrechen. Ich verwende Lumen und ein DDD / Repository-Muster, um Eloquent vollständig zu vermeiden.
Programmierer

@peterm Ich bin auch mit Eloquent Alias ​​stecken. Hast du etwas mit Eloquent gefunden?
Lizesh Shakya

77

Um Aliase für beredte Modelle zu verwenden, ändern Sie Ihren Code wie folgt:

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

Dadurch wird den Tabellennamen automatisch ein Tabellenpräfix hinzugefügt und eine ItemsModellinstanz zurückgegeben. kein bloßes Abfrageergebnis. Durch DB::rawdas Hinzufügen wird verhindert, dass Laravel Aliase mit Tabellenpräfixen versehen.


1
@ m3rg Hast du jemals einen Weg gefunden, es mit Soft Delete zum Laufen zu bringen? Abfrage schlägt mit Fehler fehlUnknown column 'table_alias.deleted_at'
dev7

Wie wäre es mit dieser Situation? SELECT * FROM fx_bank AS A RIGHT OUTER JOIN fx_ex_keys AS b auf b.bank_id = a.id AND a.agent_type = 2 WHERE b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk Verwenden Sie DB :: raw überall, um auf Tabellenaliasnamen abzuzielen. andere Laravel-Methoden werden wie gewohnt verwendet
AMIB

@ m3rg @ Yani ich benutze dies ->withTrashed()und->whereNull('table_alias.deleted_at')
Firman Hidayat

8

Hier ist, wie man es machen kann. Ich werde ein Beispiel mit Beitritt geben, damit es jemandem super klar wird.

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

Hoffe das hilft.


Können Sie ein Beispiel angeben, bei dem Alias ​​Leerzeichen anstelle von Unterstrich (_) enthält?
Channox

6

In Eloquent verwenden. Fügen Sie oben auf Ihrem Modell hinzu

protected $table = 'table_name as alias'

// Tabellenname sollte genau wie in Ihrer Datenbank sein

..dann in Ihrer Abfrage wie verwenden

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


1
Laravel beredtes sehr schlechtes Design, Alias, den Sie oben definiert haben, gut für Operationsabfragen, aber Aktualisieren und Löschen wird aufgrund Ihres Alias ​​fehlerhaft.
Messen Sie den

1

Sie können weniger Code verwenden, indem Sie Folgendes schreiben:

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

Und wenn Sie mehr Felder auswählen möchten, schreiben Sie einfach ein "," und fügen Sie weitere hinzu:

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

Dies ist sehr praktisch, wenn Sie eine komplexe Abfrage für Verknüpfungen verwenden


0

Wie bei der AMIB-Antwort, für den Soft-Delete-Fehler "Unbekannte Spalte 'table_alias.deleted_at'" einfach hinzufügen und ->withTrashed()dann selbst behandeln->whereRaw('items_alias.deleted_at IS NULL')

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.