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.