Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel雄辩查询(或使用查询生成器)中为表别名?_Php_Laravel_Laravel 4_Eloquent - Fatal编程技术网

Php 如何在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中包含别名,并且它在结果数组

假设我们正在使用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中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在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雄辩的设计非常糟糕,您在上面定义的别名可以用于操作查询,但更新和删除将出错,因为您的别名。