web-dev-qa-db-fra.com

Comment aliaser une table dans les requêtes Laravel Eloquent (ou en utilisant Query Builder)?

Disons que nous utilisons le constructeur de requêtes de Laravel:

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

Je cherche un équivalent à ce SQL:

really_long_table_name AS short_name

Cela serait particulièrement utile lorsque je dois taper beaucoup de sélections et où (ou généralement, j'inclus l'alias dans l'alias de colonne de la sélection, et il est utilisé dans le tableau de résultats). Sans alias de table, il y a beaucoup plus de dactylographie pour moi et tout devient beaucoup moins lisible. Vous ne trouvez pas la réponse dans les documents laravel, des idées?

97
prograhammer

Laravel prend en charge les alias sur les tables et les colonnes avec AS. Essayer

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

Voyons cela en action avec un formidable outil tinker

 $ php artisan bricoleur 
 [1] > Schema :: create ('nom_table_longue_ vraiment', fonction ($ table) {$ table-> incrémente ('id');}); 
 // NULL 
 [2] > DB :: table ('nom_table_longue_ vraiment') -> insert (['id' => null]); 
 // true 
 [3] > DB :: table ('nom_table_longue_longueur_de_table AS') -> select ('id.id AS uid') -> get (); 
 // array (
 // 0 => objet (stdClass) ( 
 // 'uid' => '1' 
 //) 
 //) 
157
peterm

Pour utiliser des alias sur des modèles éloquents, modifiez votre code comme suit:

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

Cela ajoutera automatiquement le préfixe de table aux noms de table et retournera une instance de modèle Items. pas un simple résultat de requête . Ajouter DB::raw empêche laravel d'ajouter des préfixes de table aux alias.

47
AMIB

Voici comment on peut le faire. Je vais donner un exemple avec rejoindre pour que cela devienne super clair pour quelqu'un.

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

J'espère que cela t'aides.

3
Koushik Das

Vous pouvez utiliser moins de code en écrivant ceci:

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

Et bien sûr, si vous voulez sélectionner plus de champs, écrivez simplement un "," et ajoutez plus:

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

Ceci est très pratique lorsque vous utilisez une requête complexe de jointure

1
Carlos h Gonzalez

Identique à la réponse AMIB, pour l’erreur de suppression logicielle "Colonne inconnue 'table_alias.deleted_at'", Ajoutez simplement ->withTrashed() puis manipulez-la comme ->whereRaw('items_alias.deleted_at IS NULL')

0
Ahmed Gamal