Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter ActiveRecord:加入回退_Php_Mysql_Codeigniter - Fatal编程技术网

Php 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.

我有一个简单的问题:如何使用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.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来实现这一点。