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

Posted

技术标签:

【中文标题】如何在 Laravel Eloquent 查询(或使用查询生成器)中为表起别名?【英文标题】:How to alias a table in Laravel Eloquent queries (or using Query Builder)? 【发布时间】:2013-07-16 19:53:51 【问题描述】:

假设我们正在使用 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】:

另外请注意,在使用 DB 门面时,您可以将别名作为表方法的第二个参数传递:

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

不确定此功能是否随特定版本的 Laravel 提供,或者它是否一直存在。

【讨论】:

【参考方案2】:

我已经尝试了所有这些选项,但没有一个适合我。然后我在 Laravel 文档中发现了一些真正有效的东西。

你可以试试这个:

DB::table('table_one as t1')
    ->select(
        't1.field_id as id','t2.field_on_t2 as field'
     )->join('table_two as t2', function ($join) 
        $join->on('t1.field_id ', '=', 't2.field_id');
    )->get()

【讨论】:

【参考方案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 product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

希望这会有所帮助。

【讨论】:

你能提供一个例子,其中别名有空格而不是下划线(_)吗?【参考方案4】:

你可以使用更少的代码,这样写:

    $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】:

在 Eloquent 中使用。 添加到您的模型之上

protected $table = 'table_name as alias'

//table_name 应该与您的数据库中的完全相同

..然后在您的查询中使用

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

【讨论】:

Laravel 雄辩的设计很差,你在上面定义的别名用于操作查询很好,但是更新和删除会因为你的别名而出错。【参考方案6】:

与AMIB答案相同,对于软删除错误“未知列'table_alias.deleted_at'”, 只需添加->withTrashed() 然后像->whereRaw('items_alias.deleted_at IS NULL') 一样自己处理

【讨论】:

【参考方案7】:

要在 eloquent 模型上使用别名,请像这样修改您的代码:

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

【讨论】:

@m3rg 你有没有找到一种方法让它与软删除一起工作?查询失败并出现错误Unknown column 'table_alias.deleted_at' 这种情况怎么样? SELECT * FROM fx_bank 作为右外连接 fx_ex_keys AS b on b.bank_id=a.id AND a.agent_type=2 WHERE b.status=1 AND b.group=-1; @jRhesk 在任何地方使用 DB::raw 来定位表别名。其他 Laravel 方法正常使用 @m3rg @Yani 我用这个->withTrashed()->whereNull('table_alias.deleted_at') 加入通话中不需要DB::raw【参考方案8】:

Laravel 支持带有 AS 的表和列的别名。试试

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

让我们用一个很棒的tinker 工具来看看它的实际效果

$ php工匠修补匠 [1] > Schema::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 => 对象(stdClass)( // 'uid' => '1' // ) // )

【讨论】:

@RubensMariuzzo 我知道。我相信你可以在 laravel 论坛forums.laravel.io 发表评论 @AldiUnanto Eloquent 怎么样?活动记录意味着在一张表上使用,因此您不需要别名。当您使用关系时,您仍然一次处理一个表(即当您在关系上定义过滤器时)。现在,如果您将 Query Builder 与 Eloquent 模型(即连接)一起使用,那么您可以在所有连接表上使用别名,但模型表除外。 @peterm 如果我在 eloquent 中使用查询生成器会怎样?我的意思是雄辩的模型需要为表名声明一个受保护的属性(例如protected $table = "books";),那么我该如何制作别名? (例如生成的sql:... FROM books AS A ... 你可以做protected $table = 'really_long_table_name AS short_name';,但是在插入时会失败。也可能会破坏关系查询。我正在使用 Lumen 和 DDD/Repository 模式来完全避免 Eloquent。 @peterm 我也被 Eloquent 别名所困扰。你在 Eloquent 中找到什么了吗?

以上是关于如何在 Laravel Eloquent 查询(或使用查询生成器)中为表起别名?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

我将如何在 Laravel Eloquent 中编写这个 MySQL 查询?

Laravel:在“query-builder”或“eloquent”中更改原始查询

Laravel 验证使用 eloquent 或 raw 查询

如何在 Laravel eloquent 的“或”条件中应用“与”条件

如何将其转换为 Query builder 或 eloquent? [复制]