如何在Laravel口才查询中为表加上别名(或使用查询生成器)?


147

可以说我们正在使用Laravel的查询生成器:

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

我正在寻找等效于此SQL:

really_long_table_name AS short_name

当我必须在许多选择和位置键入(或通常在选择的列别名中也包含别名,并且在结果数组中使用别名)时,这将特别有用。没有任何表别名,我需要输入更多的内容,并且所有内容的可读性也大大降低。在laravel文档中找不到答案,有什么想法吗?

Answers:


218

Laravel使用来支持表和列的别名AS。尝试

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

让我们看看它的强大tinker工具

$ PHP工匠修补匠
[1]>模式:: create('really_long_table_name',function($ table){$ table-> increments('id');});
// 空值
[2]> DB :: table('really_long_table_name')-> insert(['id'=> null]);
//正确
[3]> DB :: table('really_long_table_name AS t')-> select('t.id AS uid')-> get();
//数组(
// 0 => object(stdClass)(
//'uid'=>'1'
//)
//)

2
我知道@RubensMariuzzo。我相信您可以在laravel论坛forums.laravel.io
peterm

2
@AldiUnanto口才怎么样?活动记录本可以在一个表上使用,因此您不需要别名。使用关系时,您一次仍在处理一张表(即,当您在关系上定义过滤器时)。现在,如果您将查询生成器与Eloquent模型(即联接)一起使用,则可以对所有联接表(模型表)使用别名。
peterm

1
@peterm如果我雄辩地使用查询生成器怎么办?我的意思是,雄辩的模型需要为表名声明一个受保护的属性(例如protected $table = "books";),然后我该如何别名?(例如生成的sql:... FROM books AS A ...
Aldi Unanto 2015年

您可以这样做,protected $table = 'really_long_table_name AS short_name';但是在INSERT上失败。也可能中断关系查询。我正在使用流明和DDD /存储库模式来完全避免Eloquent。
prograhammer

@peterm我也坚持雄辩的别名。您是否在Eloquent身上找到了任何东西?
Lizesh Shakya

77

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

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将表前缀添加到别名。


1
@ m3rg您是否找到了使它与软删除一起工作的方法?查询失败并显示错误Unknown column 'table_alias.deleted_at'
dev7 '16

这种情况怎么样?SELECT * FROM fx_bank作为右外连接fx_ex_keys AS b在b.bank_id = a.id AND a.agent_type = 2上b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk到处都使用DB :: raw来定位表别名。通常使用其他Laravel方法
-AMIB,

@ m3rg @Yani我使用它,->withTrashed()并且->whereNull('table_alias.deleted_at')
Firman Hidayat

8

这是一种方法。我将举一个加入的例子,以使某人变得非常清楚。

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

希望这可以帮助。


您能否提供一个示例,其中别名使用空格而不是下划线(_)?
Channox

7

在雄辩中使用。在模型之上添加

protected $table = 'table_name as alias'

// table_name应该和数据库中的一样

..然后在查询中使用

ModelName::query()->select(alias.id, alias.name)


1
Laravel雄辩的设计很糟糕,您在操作查询中定义了上面的别名,但是由于您的别名,更新和删除将出错。
测量

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

当您使用联接复杂查询时,这非常实用


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.