185 votes

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 de ce SQL :

really_long_table_name AS short_name

Cela serait particulièrement utile lorsque je dois saisir un grand nombre de sélections et d'emplacements (ou lorsque j'inclus l'alias dans l'alias de colonne de la sélection et qu'il est utilisé dans le tableau de résultats). Sans alias de table, je dois taper beaucoup plus de choses et tout devient beaucoup moins lisible. Je ne trouve pas la réponse dans la documentation de Laravel, une idée ?

270voto

peterm Points 72466

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

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

Voyons ce qu'il en est en action avec une impressionnante tinker outil

$ php artisan tinker
\[1\] > Schema::create('really\_long\_table\_name', function($table) {$table->increments('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'
//   )
// )

112voto

AMIB Points 195

Pour utiliser les alias sur les modèles eloquent, 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();

Ceci ajoutera automatiquement le préfixe de table aux noms de table et renvoie une instance de Items et non un simple résultat de requête. Ajout de DB::raw empêche laravel d'ajouter des préfixes de table aux alias.

16voto

Koushik Das Points 1858

Voici comment on peut le faire. Je vais donner un exemple avec l'adhésion 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 product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

J'espère que cela vous aidera.

12voto

muinh Points 178

A utiliser dans Eloquent. Ajouter au dessus de votre modèle

protected $table = 'table_name as alias'

//le nom de la table doit être exact comme dans votre base de données

puis utiliser dans votre requête comme

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

2voto

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, il suffit d'écrire un "," et d'en ajouter :

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

C'est très pratique lorsque vous utilisez une requête complexe de jointures

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X