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

147

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 recherche 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 de localisations (ou généralement, j'inclus également l'alias dans l'alias de colonne de la sélection, et il est utilisé dans le tableau de résultats). Sans aucun 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?

Prograhammer
la source

Réponses:

218

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

$ php artisan bricoler
[1]> Schema :: create ('vraiment_long_nom_table', function ($ table) {$ table-> incréments ('id');});
// NUL
[2]> DB :: table ('vraiment_long_nom_table') -> insert (['id' => null]);
// vrai
[3]> DB :: table ('vraiment_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// tableau (
// 0 => objet (stdClass) (
// 'uid' => '1'
//)
//)
Peterm
la source
2
@RubensMariuzzo je sais. Je crois que vous pouvez laisser un commentaire avec demande dans les forums de laravel forums.laravel.io
peterm
2
@AldiUnanto Et Eloquent? Enregistrement actif destiné à être utilisé sur une table, vous n'avez donc pas besoin d'alias. Lorsque vous utilisez des relations, vous avez toujours affaire à une table à la fois (c'est-à-dire lorsque vous définissez des filtres sur la relation). Maintenant, si vous utilisez Query Builder avec un modèle Eloquent (c'est-à-dire une jointure), vous pouvez utiliser des alias sur toutes les tables jointes, mais sur la table modèle.
peterm
1
@peterm et si j'utilise le générateur de requêtes de manière éloquente? Je veux dire un modèle éloquent doit déclarer une propriété protégée pour le nom de la table (par exemple protected $table = "books";), alors comment puis-je créer un alias? (par exemple généré SQL: ... FROM books AS A ...)
Aldi Unanto
Vous pourriez le faire, protected $table = 'really_long_table_name AS short_name';mais cela échouerait sur les INSERTs. Peut également interrompre les requêtes de relation. J'utilise Lumen et un modèle DDD / Repository pour éviter complètement Eloquent.
prograhammer
@peterm Je suis également coincé avec l'alias Eloquent. Avez-vous trouvé quelque chose avec Eloquent?
Lizesh Shakya
77

Pour utiliser des alias sur des modèles éloquents, 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 un préfixe de table aux noms de table et retournera une instance de Itemsmodèle. pas un simple résultat de requête. L'ajout DB::rawempêche laravel d'ajouter des préfixes de table aux alias.

AMIB
la source
1
@ m3rg avez-vous déjà trouvé un moyen de le faire fonctionner avec la suppression logicielle? la requête échoue avec une erreurUnknown column 'table_alias.deleted_at'
dev7
et cette situation? SELECT * FROM fx_bank AS a RIGHT OUTER JOIN fx_ex_keys AS b sur b.bank_id = a.id AND a.agent_type = 2 WHERE b.status = 1 AND b.group = -1;
GFxJamal
@jRhesk Utilisez DB :: raw partout pour cibler les alias de table. d'autres méthodes Laravel sont utilisées normalement
AMIB
@ m3rg @Yani j'utilise ceci ->withTrashed()et->whereNull('table_alias.deleted_at')
Firman Hidayat
8

Voici comment procéder. Je vais donner un exemple avec l'adhésion afin 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 t'aides.

Koushik Das
la source
Pouvez-vous fournir un exemple dans lequel l'alias a un espace au lieu d'un trait de soulignement (_)?
Channox
7

À utiliser dans Eloquent. Ajoutez par-dessus votre modèle

protected $table = 'table_name as alias'

// nom_table doit être exact comme dans votre base de données

.. puis utilisez dans votre requête comme

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

muinh
la source
1
Laravel éloquent conception très médiocre, l'alias que vous définissez ci-dessus convient pour la requête d'opération, mais la mise à jour et la suppression entraîneront une erreur car votre alias.
Mes
1

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 souhaitez sélectionner plus de champs, écrivez simplement un "," et ajoutez-en 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 jointures

Carlos h Gonzalez
la source
0

Identique à la réponse AMIB, pour l'erreur de suppression logicielle "Colonne inconnue 'table_alias.deleted_at'", ajoutez simplement ->withTrashed()puis gérez-la vous-même comme->whereRaw('items_alias.deleted_at IS NULL')

Ahmed Gamal
la source