简体   繁体   English

Codeigniter ActiveRecord:加入反引号

[英]Codeigniter ActiveRecord: join backticking

I've a simple question: how can I use CodeIgniter's ActiveRecord join function? 我有一个简单的问题:如何使用CodeIgniter的ActiveRecord join函数? I want this: 我要这个:

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)

But if I use $this->db->join(cimke,"mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke") , the value 5 will be between backticks. 但是如果我使用$this->db->join(cimke,"mk_terem.id_kicsoda=5 AND mk_terem.id_target=cimke.id_cimke") ,则值5将在反引号之间。

How can I do this? 我怎样才能做到这一点?

UPDATE UPDATE

What I want? 我想要的是? If mk_terem.id_kicsoda is 1, then I want tanar.nev and when mk_terem.id_kicsoda is 5, I want cimke.nev . 如果mk_terem.id_kicsoda为1,那么我想要tanar.nev ,当mk_terem.id_kicsoda为5时,我想要cimke.nev

The full SQL-query: 完整的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)

Only a simple workaround, ugly, not elegant, but it works in this case: 只有一个简单的解决方法,丑陋,不优雅,但它适用于这种情况:

$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;

If anybody knows better please show it! 如果有人知道更好请展示它!

$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);

or use 或使用

$this->db->query('AND_YOUR_RAW_SQL_QUERY_HERE');

I know i am very answering this question very late. 我知道我很晚才回答这个问题。 Just i am sharing my knowledge. 只是我在分享我的知识。 It may help us to known something. 它可能有助于我们了解某些事情。 If I am wrong, Please tell me. 如果我错了,请告诉我。 I am answering this question by the full query you posted on your question. 我正在通过您在问题上发布的完整查询回答此问题。 Kindly check it below. 请在下面查看。

$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();

I got the query which you posted in the question as full Query. 我将您在问题中发布的查询作为完整查询。 Check it below. 检查下面。

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)`

I believe everything is possible to do by codeignitor Active record. 我相信一切都可以通过codeignitor Active记录来完成。 No need to execute the query in $this->db->query() as raw sql. 无需在$this->db->query()执行查询作为原始sql。

@uzsolt: I am explaining this because of the argument you made under the topic "http://stackoverflow.com/questions/8344769/writing-sql-queries-in-codeigniter-2-0". @uzsolt:我正在解释这个问题是因为您在“http://stackoverflow.com/questions/8344769/writing-sql-queries-in-codeigniter-2-0”主题下提出的论点。 And I will try your other bugs you posted under the above URL too shortly and get back to you. 我会尽快尝试您在上述网址下发布的其他错误,然后再回复您。 If i am anything wrong, kindly let me know. 如果我有什么不对,请告诉我。 Thanks. 谢谢。 :) :)

Another simple solution would be to temporarily set the protect_identifiers off like so: 另一个简单的解决方案是暂时将protect_identifiers设置为关闭:

$this->db->_protect_identifiers = false;

After making the query you could set it back to true 在进行查询后,您可以将其设置为true

If you swap the conditions around AND, it will work! 如果您在AND周围交换条件,它将起作用! CodeIgniter only escapes the first part of the condition. CodeIgniter只转义条件的第一部分。 So, inthis should work: 所以,这应该工作:

$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