How to alias a table in Laravel Eloquent queries (or using Query Builder)? How to alias a table in Laravel Eloquent queries (or using Query Builder)? php php

How to alias a table in Laravel Eloquent queries (or using Query Builder)?


Laravel supports aliases on tables and columns with AS. Try

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

Let's see it in action with an awesome tinker tool

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


To use aliases on eloquent models modify your code like this:

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

This will automatically add table prefix to table names and returns an instance of Items model. not a bare query result.Adding DB::raw prevents laravel from adding table prefixes to aliases.


Here is how one can do it. I will give an example with joining so that it becomes super clear to someone.

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

Hope this helps.