Comment alias une table dans Laravel Eloquent queries (ou en utilisant Query Builder)?

Disons que nous utilisons le générateur 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 quand je dois taper beaucoup de sélections et wheres (ou généralement j'inclus l'alias dans l'alias de la 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 frappe pour moi et tout devient beaucoup moins lisible. Vous ne trouvez pas la réponse dans les documents laravel, des idées?

88
demandé sur prograhammer 2013-07-18 06:54:22

5 réponses

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-le en action avec un outil génial tinker

$ 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'
//   )
// )
146
répondu peterm 2014-03-09 04:52:49

Pour utiliser des alias sur des modèles eloquent, modifiez votre code comme ceci:

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 Items model. pas un résultat de requête nu. L'ajout de DB::raw empêche laravel d'ajouter des préfixes de table aux alias.

40
répondu AMIB 2018-01-06 05:29:33

Voici comment on peut le faire. Je vais donner un exemple avec l'adhésion afin qu'il 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 aide.

2
répondu Koushik Das 2017-11-11 15:09:48

À utiliser dans Eloquent. Ajouter sur le dessus de votre modèle

protected $table = 'table_name as alias'

/ / table_name devrait être exact comme dans votre base de données

..ensuite utiliser dans votre requête comme

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

1
répondu muinh 2018-07-20 12:12:36

Même que la réponse AMIB, pour l'erreur de suppression douce "Colonne inconnue' table_alias.deleted_at'", il suffit d'Ajouter ->withTrashed() puis de le gérer vous-même comme ->whereRaw('items_alias.deleted_at IS NULL')

0
répondu Ahmed Gamal 2018-04-01 16:41:44