【问题标题】:Codeigniter DB Query with where, or, and.. and likeCodeigniter DB Query with where, or, and.. and like
【发布时间】:2012-11-06 12:20:55
【问题描述】:

我在下面有一个查询条件(减去 select、from 等)

$this->db->where('show_year', $yyyy);
$this->db->or_where('idn', $idn);
$this->db->or_like('post_slug', $idn);

什么形式

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
OR `idn` = 'the' 
AND `post_slug` LIKE '%the%'

不过我希望它更像

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
AND (`idn` = 'the' OR `post_slug` LIKE '%the%')

我的问题是我不确定 CI 的活动记录是否支持这个概念,如果支持,我将如何解决它,因为我在文档中的任何地方都找不到它的概念。无论我如何更改likeor_likewhereor_where,我什至无法确定类似的东西。所以有人有任何想法吗?如果可能的话,我宁愿远离原始查询,但如果我必须准备一个并这样做,我会,只是不想这样做。

【问题讨论】:

  • 我认为这个答案可能会有所帮助,stackoverflow.com/questions/11937867/… 只需将(...) 部分作为字符串放入一个$this->db->where() 调用中(使用()s)
  • 我想你可能对那个有兴趣。希望有一种方法可以让它保持部分分解,以便在细化时更容易及时更改,并沿着随机条件构建整个查询的路线,但如果这是唯一的情况我会接受它,很好的发现

标签: php mysql codeigniter activerecord


【解决方案1】:

你试过了吗?

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' AND `idn` = 'the' 
OR `show_year`='2009' AND `post_slug` LIKE '%the%'

我认为下面会产生上面的表达式:

$this->db->select(...)->from(...)->
where("show_year","2009")->where("idn","the")->
or_where("show_year","2009")->like("post_slug","%the%")

【讨论】:

  • 混合 ANDOR 不带括号从可读性/可维护性的角度来看可能是一个坏主意,即使分布性现在按预期工作。最好谨慎行事并使用DNFCNF 子句。
  • 我知道,但是 CI 的 AR 不能做括号。这只是一个(丑陋的)解决方法。检查 mysql 中的运算符首选项:dev.mysql.com/doc/refman/5.0/en/operator-precedence.html - mysql 在 OR 之后首先评估 AND
猜你喜欢
  • 2013-03-29
  • 2020-09-26
  • 2015-03-08
  • 2020-06-27
  • 2012-10-10
  • 2013-06-04
相关资源
最近更新 更多