1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

株式会社シンプルウェイAdvent Calendar 2024

Day 11

【FuelPHP】クエリビルダで名前付きサブクエリを結合する方法

Last updated at Posted at 2024-12-11

概要

FuelPHPにおける、クエリビルダで名前付きサブクエリを結合する方法を記載します。
以下のSQLの構築を例に説明します。(SQLの内容がイマイチですが不問とします)

select
    *
from
    user
    inner join (
        select
            *
        from
            branch_user
        where
            branch_name = '関東'
    ) branch_table on user.id = branch_table.id -- サブクエリにbranch_tableという名前を付与

テーブルは以下を用意します。

userテーブル

id name area
1 田中太郎 関東
2 山田花子 関東
3 山田五郎 北海道
4 高橋玉子 東北
5 伊藤はな 九州
6 里中さとる 九州

branch_userテーブル

id name area
1 田中太郎 関西
2 藤倉宗則 関東
3 青木隼也 関東
4 高橋玉子 関東
5 伊藤はな 関東
6 里中さとる 関東
7 安奈真優 関東

コード

$sub_query = DB::select()->from('user')->where('area', '=', '関東')->compile();
$query = DB::select()->from('user')
	->join(array(DB::expr($sub_query), 'branch_table'), 'INNER')
	->on('user.id', '=', 'branch_table.id')
	->compile();
Debug::dump($sub_query,$query);

解説

1行目の$sub_queryに、サブクエリのSQLを設定しています。
2行目〜5行目は、実行するSQLの構築処理になります。
3行目の以下の処理で名前付きサブクエリを内部結合しています。

->join(array(DB::expr($sub_query), 'branch_table'), 'INNER')

join()の第一引数に結合するテーブル(今回はサブクエリ)、名前を配列で指定しています。ここで重要なのは、サブクエリの指定にDB::expr()を使用することです。これを使わないとエスケープ処理が正しく行われません。

実行結果

スクリーンショット 2024-12-11 16.04.24.png

補足

なおOracleを使用している場合は、coreファイルをオーバーライドする必要があります。
オーバーライドの方法については割愛します。

core/classes/database/query/builder/join.php@compile

//   Add the alias if needed
if ($this->_alias)
{
    $sql .= ' AS '.$db->quote_table($this->_alias);
}

参考にしたサイト

公式ドキュメント
Query builder subquery in join?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?