假设我们正在使用Laravel的查询构建器:
$users = DB::table('really_long_table_name')
->select('really_long_table_name.id')
->get();
我正在寻找这个SQL的等价物:
really_long_table_name AS short_name
当我必须输入大量的选择和数据时,这将特别有用(或者通常我也会在select的列别名中包含别名,并且它会在结果数组中使用)。没有任何表别名,我会有更多的输入,一切都变得不那么可读。在laravel docs中找不到答案,有什么想法吗?
答案 0 :(得分:169)
Laravel支持使用AS
的表和列上的别名。尝试
$users = DB::table('really_long_table_name AS t')
->select('t.id AS uid')
->get();
让我们看一下真棒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' // ) // )
答案 1 :(得分:51)
要在雄辩模型上使用别名,请修改以下代码:
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();
这将自动将表前缀添加到表名并返回Items
模型的实例。不是一个简单的查询结果。
添加DB::raw
可防止laravel将表前缀添加到别名中。
答案 2 :(得分:3)
以下是人们如何做到这一点。我将举一个加入的例子,以便它变得非常清楚。
$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();
希望这有帮助。
答案 3 :(得分:2)
用于雄辩。 在模型之上添加
protected $table = 'table_name as alias'
// table_name应该与您的数据库中的完全相同
..然后在查询中使用
ModelName::query()->select(alias.id, alias.name)
答案 4 :(得分:1)
您可以使用更少的代码来编写:
$users = DB::table('really_long_table_name')
->get(array('really_long_table_name.field_very_long_name as short_name'));
当然,如果您想选择更多字段,只需写一个“,”并添加更多内容:
$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'));
当您使用联接复杂查询时,这非常实用
答案 5 :(得分:0)
与AMIB答案相同,对于软删除错误"未知列' table_alias.deleted_at'",
只需添加->withTrashed()
,然后自行处理->whereRaw('items_alias.deleted_at IS NULL')