繁体   English   中英

Codeigniter ActiveRecord:加入反引号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM