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

时间:2013-07-18 02:54:22

标签: php laravel laravel-4 eloquent

假设我们正在使用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中找不到答案,有什么想法吗?

6 个答案:

答案 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')