Php Codeigniter ActiveRecord:加入回退
我有一个简单的问题:如何使用CodeIgniter的ActiveRecord连接函数?我想要这个:Php Codeigniter ActiveRecord:加入回退,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有一个简单的问题:如何使用CodeIgniter的ActiveRecord连接函数?我想要这个: 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->joincimke,mk_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)
但是如果我使用$this->db->joincimke,mk_terem.id_kicsoda=5和mk_terem.id_target=cimke.id_cimke,那么值5将介于两个倒勾之间
我该怎么做
更新
我想要什么?如果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)
或使用
$this->db->query('AND_YOUR_RAW_SQL_QUERY_HERE');
只有一个简单的解决办法,丑陋,不优雅,但它在这种情况下有效:
$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->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)`
我得到了你在问题中发布的完整查询。请在下面查看
$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)`
我相信通过Codeignator Active record,一切都是可能的。无需在$this->db->query中以原始sql执行查询
@乌兹尔特:我之所以解释这一点,是因为你在这个话题下提出的论点http://stackoverflow.com/questions/8344769/writing-sql-queries-in-codeigniter-2-0. 我会很快尝试你在上面的URL下发布的其他错误,然后回复你。如果我有什么问题,请告诉我。谢谢 另一个简单的解决方案是暂时关闭protect_标识符,如下所示:
$this->db->_protect_identifiers = false;
在进行查询后,如果交换条件并将其设置为true,则可以将其设置回true!CodeIgniter仅能逃逸条件的第一部分。 因此,这应该起作用:
$this->db->join('cimke',"mk_terem.id_kicsoda = 5 AND mk_terem.id_target = cimke.id_cimke", "left")
不,这不好。请考虑表CIMKE中有一个IDI-CIMKE值为10的项目,表TANAR中有IDITANAR值10的项目。我的查询结果与您的查询结果不同,不是第二次:。我想要什么?如果mk_terem.id_kicsoda为1,那么我想要tanar.nev,当mk_terem.id_kicsoda为5时,我想要cimke.nev。添加一个简单的答案:$this->db->query SELECT terem.nev terem_nev,elem_tipus.nev tipus_nev,If nullcimke.nev,tanar.nev nev从mk_terem左加入mk_terem.id_terem=terem.id_terem左加入mk_terem.id_kicsoda=5和mk_terem.id_target=cimke.id_cimke左加入mk_terem.id_kicsoda=1和mk_terem.id_terem.id_tanar左加入mk_terem.id_tipus.id_kicsoda=elem是,我知道我可以使用原始sql查询,但许多查询都是通过手工创建的,使用ActiveRecord既舒适又容易。很抱歉,我没有回答你的评论。。。谢谢:首先:谢谢你的回答!什么版本的Codeigniter?正如我在最新的2.1.2版本中看到的,它没有尝试保护条件检查。但是这个问题还不是真的,因为我写了一个小的库来代替CI的ActiveRecord,它对我来说很好:再次感谢!我认为它只适用于较新版本,因为如果您检查第333行,您可以看到_protect_标识符是一个函数。在最新版本中,保护标识符是一个变量,保护标识符是一个函数。这个问题在CI v3-DEV中已经解决。顺便说一句,几个月前,我知道如何破解CI AR来实现这一点。