如何在 LaravelEloquent 查询(或使用查询生成器)中作为表的别名?

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

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

我正在寻找一个类似于这个 SQL 的东西:

really_long_table_name AS short_name

当我必须键入大量 select 和 where (或者通常在 select 的列别名中包含别名,并在结果数组中使用该别名)时,这将非常有帮助。如果没有任何表别名,对我来说就会有更多的输入,所有的东西都会变得不那么可读。在幼虫档案里找不到答案,有什么办法吗?

273815 次浏览

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

要在雄辩的模型上使用别名,可以像下面这样修改代码:

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

与 AMIB 答案相同,对于软删除错误“ Unknown column‘ table _ alias. delete _ at’”, 只需添加 ->withTrashed(),然后处理它自己喜欢 ->whereRaw('items_alias.deleted_at IS NULL')

以下是一个人如何做到这一点。我将给出一个加入的例子,以便它成为超级清楚的人。

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

希望这个能帮上忙。

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

protected $table = 'table_name as alias'

//table _ name 应该与数据库中的相同

. . 然后使用在您的查询喜欢

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

您可以使用更少的代码,编写如下代码:

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

这在使用联接复杂查询时非常实用

我已经尝试了所有这些选择,没有一个适合我。然后我在 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()

还要注意,在使用 DB facade 时,可以将别名作为 table 方法的第二个参数传递:

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


不确定这个特性是否与特定版本的 Laravel 一起出现,或者它是否一直都是内置的。

在最新版本的 Laravel9中,可以使用别名作为 column:

$events = Booking::whereBetween('sessionDateTime', [$today, $nextMonth])->get(['bookings.sessionDateTime as start']); // start is an alias here