web-dev-qa-db-ja.com

Laravel Eloquentクエリ(またはクエリビルダを使用)でテーブルのエイリアスを作成する方法は?

Laravelのクエリビルダーを使用しているとしましょう。

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

私はこのSQLに相当するものを探しています:

really_long_table_name AS short_name

これは、多くの選択と場所を入力する必要がある場合(または通常、選択の列エイリアスにもエイリアスを含める必要があり、結果配列で使用される場合)、特に役立ちます。テーブルエイリアスがないと、入力がずっと増え、すべてが読みにくくなります。 laravelドキュメントで答えが見つかりませんか?

106
prograhammer

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

雄弁なモデルでエイリアスを使用するには、コードを次のように変更します。

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がテーブルプレフィックスをエイリアスに追加できなくなります。

53
AMIB

これがその方法です。参加者に非常に明確になるように、参加の例を示します。

$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
Koushik Das

Eloquentで使用するには。モデルの上に追加

protected $table = 'table_name as alias'

// table_nameは、データベースのとおりに正確である必要があります

..次にクエリで次のように使用します

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

2
muinh

以下のコードを使用して、より少ないコードを使用できます。

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

複雑な結合クエリを使用する場合、これは非常に実用的です

1

AMIBの回答と同じように、ソフト削除エラー「不明な列 'table_alias.deleted_at'」の場合は、->withTrashed()を追加してから、自分で->whereRaw('items_alias.deleted_at IS NULL')のように処理します。

0
Ahmed Gamal