CI Query Builder クラスで次のクエリを生成できますか?
SELECT name
FROM table1 t1
JOIN
(SELECT ID FROM table2 ORDER BY id LIMIT 5) t2
ON t2.id=t1.t2_id
WHERE t1.id>5
CI Query Builder クラスで次のクエリを生成できますか?
SELECT name
FROM table1 t1
JOIN
(SELECT ID FROM table2 ORDER BY id LIMIT 5) t2
ON t2.id=t1.t2_id
WHERE t1.id>5
それを行うにはいくつかの方法があります。ハックである1つの方法はここにあります。
この SQL を CodeIgniter のアクティブ レコードに書き直すにはどうすればよいですか?
この別の方法は非常に簡単です。
$this->db
->select('ID')
->from('table2')
->order_by('id')
->limit('5');
$subquery = $this->db->_compile_select();
$this->db->_reset_select();
$query = $this->db
->select('t1.name')
->from('table1 t1 ')
->join("($subquery) t2","t2.id = t1.t2_id")
->get('table1 t1');
それについていくつかのポイント。
get はクエリを実行するため、サブクエリで from 句を使用する必要があります。
codeigniter 2 では _compile_select と _reset_select は保護されたメソッドであるためアクセスできません。
system/database/DB_active_rec.php の両方のメソッドの前にキーワードを削除する必要がある場合があります
こちらの記事も参考になります。
CI3 では、エスケープに 4 番目のパラメーターを使用するだけです
$this->db->from('table')
->join('SELECT id from table2 where something=%s) as T2'),'table.id=T2.id', 'LEFT',NULL)
->get()->row();
SQL インジェクションを回避するために、サブクエリでパラメーターをエスケープすることを忘れないでください。
このライブラリは、クエリ ビルダーでサブクエリを使用するのに役立ちます。このライブラリのドキュメントを参照してください。