【问题标题】:Codeigniter ActiveRecord: join backtickingCodeigniter ActiveRecord:加入反引号
【发布时间】:2011-12-13 05:04:17
【问题描述】:

我有一个简单的问题:如何使用 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 的值将在反引号之间。

我该怎么做?

更新

我想要什么?如果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)

【问题讨论】:

  • 此问题已在 CI v3-DEV 中修复。顺便说一句,几个月前,我 explained here 如何破解 CI AR 来实现这一目标。

标签: php mysql codeigniter


【解决方案1】:

只是一个简单的解决方法,丑陋,不优雅,但在这种情况下有效:

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

如果有人知道更好,请展示它!

【讨论】:

    【解决方案2】:
    $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');
    

    【讨论】:

    • 不,这不好。请考虑在表cimke 中有一个id_cimke 值为10 的项目,在表tanar 中有一个id_tanar 值为10 的项目。我的查询结果与您的查询结果不同(不是第二个:))。我想要的是?如果mk_terem.id_kicsoda 是1,那么我想要tanar.nev,当mk_terem.id_kicsoda 是5 时,我想要cimke.nev
    • 添加了一个简单的答案:stackoverflow.com/questions/7860441/…
    • $this->db->query(" 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) ")也是如此
    • 是的,我知道我可以使用原始 sql 查询,但是许多查询是动态创建的,使用 ActiveRecord 很舒服(也更容易)。抱歉,我没有回答您的评论...谢谢:)
    【解决方案3】:

    另一个简单的解决方案是像这样暂时关闭protect_identifiers:

    $this->db->_protect_identifiers = false;
    

    进行查询后,您可以将其设置回true

    【讨论】:

    【解决方案4】:

    我知道我很晚才回答这个问题。只是我在分享我的知识。它可以帮助我们了解一些事情。如果我错了,请告诉我。我正在通过您在问题上发布的完整查询来回答这个问题。请在下方查看。

    $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”主题下提出的论点。我会尽快尝试您在上述 URL 下发布的其他错误并回复您。如果我有什么问题,请告诉我。谢谢。 :)

    【讨论】:

    • 首先:感谢您的回答!什么版本的 Codeigniter?正如我在最新(2.1.2)版本中看到的那样,没有尝试保护条件(检查github.com/EllisLab/CodeIgniter/blob/2.1-stable/system/database/…)。但是这个问题还不是实际的,因为我写了一个小库而不是 CI 的 ActiveRecord,它对我很有效:) 再次感谢!
    【解决方案5】:

    如果您交换 AND 周围的条件,它将起作用! CodeIgniter 只转义条件的第一部分。 所以,这应该可以工作:

    $this->db->join('cimke',"mk_terem.id_kicsoda = 5 AND mk_terem.id_target = cimke.id_cimke", "left")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多