[英]Codeigniter ActiveRecord: join backticking
我有一個簡單的問題:如何使用CodeIgniter的ActiveRecord join
函數? 我要這個:
LEFT JOIN cimke ON (mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke)
LEFT JOIN tanar ON (mk_terem.id_kicsoda=1 AND mk_terem.id_target=tanar.id_tanar)
但是如果我使用$this->db->join(cimke,"mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke")
,則值5
將在反引號之間。
我怎樣才能做到這一點?
UPDATE
我想要的是? 如果mk_terem.id_kicsoda
為1,那么我想要tanar.nev
,當mk_terem.id_kicsoda
為5時,我想要cimke.nev
。
完整的SQL查詢:
SELECT
terem.nev terem_nev,
elem_tipus.nev tipus_nev,
(IFNULL(cimke.nev,tanar.nev)) nev
FROM mk_terem
LEFT JOIN terem ON mk_terem.id_terem=terem.id_terem
LEFT JOIN cimke ON (mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke)
LEFT JOIN tanar ON (mk_terem.id_kicsoda=1 AND mk_terem.id_target=tanar.id_tanar)
LEFT JOIN elem_tipus ON (mk_terem.id_kicsoda=elem_tipus.id_kicsoda)
只有一個簡單的解決方法,丑陋,不優雅,但它適用於這種情況:
$original_reserved = $this->db->_reserved_identifiers;
$this->db->_reserved_identifiers[] = 5;
$this->db->_reserved_identifiers[] = 1;
// or any other values
$this->db->join('with critical values and conditions');
// some db-stuff
$this->db->_reserved_identifiers = $original_reserved;
如果有人知道更好請展示它!
$this->db->join('cimke', 'mk_terem.id_target = cimke.id_cimke');
$this->db->join('tanar', 'mk_terem.id_target = tanar.id_tanar');
$this->db->where('mk_terem.id_kicsoda', 5);
$this->db->where('mk_terem.id_kicsoda', 1);
或使用
$this->db->query('AND_YOUR_RAW_SQL_QUERY_HERE');
我知道我很晚才回答這個問題。 只是我在分享我的知識。 它可能有助於我們了解某些事情。 如果我錯了,請告訴我。 我正在通過您在問題上發布的完整查詢回答此問題。 請在下面查看。
$this->db->from('mk_terem');
$this->db->select('terem.nev terem_nev, elem_tipus.nev tipus_nev, (IFNULL(cimke.nev,tanar.nev)) nev');
$this->db->join('terem','mk_terem.id_terem=terem.id_terem','left');
$this->db->join('cimke','(mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke)','left');
$this->db->join('tanar','(mk_terem.id_kicsoda=1 AND mk_terem.id_target=tanar.id_tanar)','left');
$this->db->join('elem_tipus','(mk_terem.id_kicsoda=elem_tipus.id_kicsoda)','left'); $this->db->get();
我將您在問題中發布的查詢作為完整查詢。 檢查下面。
SELECT `terem`.`nev` terem_nev, `elem_tipus`.`nev` tipus_nev, (IFNULL(cimke.nev, `tanar`.`nev))` nev FROM (`mk_terem`) LEFT JOIN `terem` ON `mk_terem`.`id_terem`=`terem`.`id_terem` LEFT JOIN `cimke` ON `mk_terem`.`id_kicsoda`=`5` AND mk_terem.id_target=cimke.id_cimke) LEFT JOIN `tanar` ON `mk_terem`.`id_kicsoda`=`1` AND mk_terem.id_target=tanar.id_tanar) LEFT JOIN `elem_tipus` ON `mk_terem`.`id_kicsoda`=`elem_tipus`.`id_kicsoda)`
我相信一切都可以通過codeignitor Active記錄來完成。 無需在$this->db->query()
執行查詢作為原始sql。
@uzsolt:我正在解釋這個問題是因為您在“http://stackoverflow.com/questions/8344769/writing-sql-queries-in-codeigniter-2-0”主題下提出的論點。 我會盡快嘗試您在上述網址下發布的其他錯誤,然后再回復您。 如果我有什么不對,請告訴我。 謝謝。 :)
另一個簡單的解決方案是暫時將protect_identifiers設置為關閉:
$this->db->_protect_identifiers = false;
在進行查詢后,您可以將其設置為true
如果您在AND周圍交換條件,它將起作用! CodeIgniter只轉義條件的第一部分。 所以,這應該工作:
$this->db->join('cimke',"mk_terem.id_kicsoda = 5 AND mk_terem.id_target = cimke.id_cimke", "left")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.