如何在Laravel Eloquent查询(或使用查询生成器)中为表起别名?

2022-08-30 06:28:35

假设我们正在使用Laravel的查询构建器:

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

我正在寻找与此SQL等效的:

really_long_table_name AS short_name

当我必须键入大量选择和位置时,这将特别有用(或者通常我也在选择的列别名中包含别名,并在结果数组中使用)。没有任何表别名,对我来说,输入的内容要多得多,而一切都变得不那么可读。在laravel文档中找不到答案,有什么想法吗?


答案 1

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

答案 2

要在雄辩的模型上使用别名,请修改代码,如下所示:

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

这将自动向表名添加表前缀,并返回模型的实例。不是裸查询结果。添加可防止 laravel 将表前缀添加到别名。ItemsDB::raw


推荐