index.php

https://個人の見解.jp

CodeIgniter4 のクエリビルダでサブクエリを作る

<?php

namespace App\Models;

use CodeIgniter\Model;

class Table1 extends Model
{
    protected $table = 'table1';

    public function getExample()
    {
        $subQuery = $this->db->table('table2')
            ->select('table2.column')
            ->where('column', 1)
            ->getCompiledSelect();

        $this->db->table($this->table)
            ->join("{$subQuery} as table2", 'table1.column = table2.column', 'left', false)
            ->get()->getResult();
    }
}

getCompiledSelect()BaseBuilder に生えてるから $this->db->table() しないといけないっぽい。1
CodeIgniter4 では fromSubquery()selectSubquery() が追加されたみたいだけど JOIN で使いたいときは CodeIgniter3 と同じように組み立てないといけないみたい。
joinSubquery() 的なものも欲しいっす…


  • この記事では $ php spark make:model をしたときに作成される Model ファイル内で実装しています。
  • join() の第三引数で escape を無効にしています。外部からの値を許容する場合は十分に注意してください。

iliiliiiliili.hatenablog.jp


  1. 検証してない+記述量が増えるだけだけど $this->db->newQuery()->from('table') でも BaseBuilder を返却してるからいけると思う。多分。