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


147

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

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

このSQLに相当するものを探しています。

really_long_table_name AS short_name

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

回答:


218

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');});
// ヌル
[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'
//)
//)

2
@RubensMariuzzo私は知っています。私はあなたがlaravelフォーラムでリクエストにコメントを残すことができると信じてforums.laravel.io
peterm

2
@AldiUnanto Eloquentはどうですか?1つのテーブルで使用するためのアクティブレコードなので、エイリアスは必要ありません。リレーションを使用するときは、まだ一度に1つのテーブルを処理しています(つまり、リレーションシップにフィルターを定義するとき)。Eloquentモデル(つまり結合)でクエリビルダーを使用している場合、結合されたすべてのテーブル(モデルテーブルを除く)でエイリアスを使用できます。
peterm 2015

1
@peterm eloquentでクエリビルダーを使用するとどうなりますか?雄弁なモデルがテーブル名の保護されたプロパティを宣言する必要があることを意味します(例protected $table = "books";)、それからどのようにエイリアスを作成できますか?(例:生成されたsql:... FROM books AS A ...
Aldi Unanto 2015

できますprotected $table = 'really_long_table_name AS short_name';が、INSERTでは失敗します。また、関係クエリが壊れる可能性があります。Eloquentを完全に回避するために、LumenとDDD / Repositoryパターンを使用しています。
プログラハンマー2015

@peterm私もEloquentエイリアスで立ち往生しています。Eloquentで何か見つけましたか?
Lizesh Shakya

77

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

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


1
@ m3rgソフト削除で機能させる方法を見つけたことがありますか?クエリがエラーで失敗するUnknown column 'table_alias.deleted_at'
dev7

この状況はどうですか?SELECT * FROM fx_bank AS a RIGHT OUTER JOIN fx_ex_keys AS b on b.bank_id = a.id AND a.agent_type = 2 WHERE b.status = 1 AND b.group = -1;
GFxJamal 2018年

@jRhesk DB :: rawをどこでも使用して、テーブルエイリアスをターゲットにします。他のLaravelメソッドは通常どおり使用されます
AMIB

@ m3rg @Yani私はこれ->withTrashed()を使用します->whereNull('table_alias.deleted_at')
Firman Hidayat

8

これを行う方法を次に示します。参加する例を挙げて、誰かにはっきりわかるようにします。

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

お役に立てれば。


エイリアスにアンダースコア(_)の代わりに空白がある例を提供できますか?
Channox

7

Eloquentで使用します。モデルの上に追加

protected $table = 'table_name as alias'

// table_nameはデータベースと同じにする必要があります

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

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


1
Laravel雄弁な非常に貧弱な設計、操作のクエリに対して上で定義したエイリアスですが、エイリアスのために更新と削除はエラーになります。
2018年

1

あなたはこれを書いて、より少ないコードを使うことができます:

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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.