wake-up-neo.com

Wie kann eine Tabelle in Laravel Eloquent-Abfragen (oder mit dem Query Builder) als Alias ​​bezeichnet werden?

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 dieser SQL:

really_long_table_name AS short_name

Dies wäre besonders hilfreich, wenn ich viele Selects und Wheres eingeben muss (oder ich gebe normalerweise den Aliasnamen in den Spaltenalias des Selects ein, und er wird im Ergebnis-Array verwendet). Ohne Tabellen-Aliase gibt es für mich viel mehr Tipparbeit und alles wird viel weniger lesbar. Kann die Antwort in den Laravel-Dokumenten keine Ideen finden?

97
prograhammer

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 uns es mit einem fantastischen tinker-Tool in Aktion sehen

 $ php Handwerker basteln 
 [1] > Schema :: create ('really_long_table_name', Funktion ($ table) {$ table-> inkrementiert ('id');}); 
 // NULL 
 [2] > DB :: table ('really_long_table_name') -> insert (['id' => null ')); 
 // true 
 [3] > DB :: table ('really_long_table_name AS t') -> select ('t.id AS uid') -> get (); 
 // array (
 // 0 => object (stdClass) ( 
 // 'uid' => '1' 
 //) 
 //) 
157
peterm

Um Aliasnamen für eloquente Modelle zu verwenden, ändern Sie Ihren Code folgendermaßen:

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

Dies fügt den Tabellennamen automatisch ein Tabellenpräfix hinzu und gibt eine Instanz von Items model zurück. kein bloßes Abfrageergebnis . Durch das Hinzufügen von DB::raw wird verhindert, dass laravel den Aliases Tabellenpräfixe hinzufügt.

47
AMIB

In Eloquent zu verwenden. Ergänzen Sie Ihr Modell

protected $table = 'table_name as alias'

// table_name sollte genau wie in Ihrer Datenbank sein

..then verwenden Sie in Ihrer Anfrage gerne

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

4
muinh

So kann man es machen. Ich werde ein Beispiel für das Beitreten geben, damit es für jemanden absolut 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 family_name', 'pf.id as family')
        ->orderBy('pr.id', 'desc')
        ->get();

Hoffe das hilft.

3
Koushik Das

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 natürlich, wenn Sie mehr Felder auswählen möchten, schreiben Sie einfach ein "," und fügen Sie mehr 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 Verknüpfungsabfrage verwenden

1

Gleiche Antwort wie AMIB, für Soft-Delete-Fehler "Unbekannte Spalte 'table_alias.deleted_at'", Fügen Sie einfach ->withTrashed() hinzu und behandeln Sie es selbst wie ->whereRaw('items_alias.deleted_at IS NULL').

0
Ahmed Gamal