Php 如何在Laravel雄辩查询(或使用查询生成器)中为表别名?
假设我们正在使用Laravel的查询生成器:Php 如何在Laravel雄辩查询(或使用查询生成器)中为表别名?,php,laravel,laravel-4,eloquent,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和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组
$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的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?laravel支持表和列上的别名,并将
设置为
。试一试
$users=DB::table('really\u long\u table\u name AS t')
->选择('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'
// )
// )
$php artisan tinker
[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'
// )
// )
要在雄辩的模型上使用别名,请按如下方式修改代码:
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();
这将自动将表前缀添加到表名称中,并返回项
模型的实例。不是一个简单的查询结果。
添加
DB::raw
可防止laravel向别名添加表前缀。与AMIB答案相同,用于软删除错误“未知列'table_alias.deleted_at'”,
只需添加
->withTrashed()
然后自己处理它,就像->whereRaw('items\u alias.deleted\u 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\u name as alias'
//表名称应与数据库中的名称完全相同
…然后在查询中使用
ModelName::query()->选择(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'));
这在使用复杂查询时非常实用@RubensMariuzzo我知道。我相信你可以在laravel forums@AldiUnanto发表评论或请求,那么雄辩又如何呢?活动记录用于一个表,因此不需要别名。当您使用关系时,您仍在一次处理一个表(即,在关系上定义筛选器时)。现在,如果将查询生成器与Eloquent模型(即联接)一起使用,则可以在所有联接的表上使用别名,但不能在模型表上使用别名。@peterm如果在Eloquent中使用查询生成器会怎么样?我的意思是,雄辩的模型需要为表的名称声明一个受保护的属性(例如,
protected$table=“books”
),那么如何生成别名?(例如,生成的sql:…作为一个…
)您可以执行受保护的$table='really\u long\u table\u name AS short\u name'代码>但这在插入时会失败。也可能中断关系查询。我使用Lumen和DDD/存储库模式来完全避免雄辩。@peterm我也被雄辩的alias困住了。你有没有发现任何有说服力的东西?@m3rg你有没有找到一种方法让它与软删除一起工作?查询失败,出现错误未知列“table\u alias”。已删除“
此情况如何?在b.bank_id=a.id和a.agent_type=2上选择*FROM fx_bank作为右外部联接fx_ex_键,其中b.status=1和b.group=-1@jRhesk使用DB::raw everywhere以表别名为目标。其他Laravel方法用作normal@m3rg@Yani我在join call中使用这个->withTrashed()
和->whereNull('table_alias.deleted_at')
不需要DB::raw
你能提供一个alias使用空格而不是下划线(41;的例子吗?Laravel雄辩的设计非常糟糕,您在上面定义的别名可以用于操作查询,但更新和删除将出错,因为您的别名。