179

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

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

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

really_long_table_name AS short_name

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

4

8 回答 8

263

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'
// )
// )
于 2013-07-18T03:15:25.280 回答
105

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

于 2015-07-25T07:50:08.640 回答
14

这是如何做到的。我将举一个加入的例子,这样对某人来说就很清楚了。

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

希望这可以帮助。

于 2017-11-11T15:09:48.777 回答
11

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

protected $table = 'table_name as alias'

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

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

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

于 2018-07-20T12:12:36.020 回答
2

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

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

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

于 2019-04-27T22:25:17.727 回答
1

我已经尝试了所有这些选项,但没有一个对我有用。然后我在 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()
于 2021-09-06T13:13:45.903 回答
1

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

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

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

于 2021-11-20T17:36:01.843 回答
0

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

于 2017-10-30T12:48:10.397 回答