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?
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' // ) // )
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.
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.
À 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)
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')