在Zend_Db_Select的where()子句中如何使用问号“?”?

3

我有下面这个MySQL查询语句,现在想将其翻译成等效的Zend select()语句:

SELECT `entity_id` FROM `my_table` WHERE `attribute_id` IN (541,554,555,556) \
AND LOWER(REPLACE(TRIM(`value`), '-', '')) REGEXP '([^[:space:]]* )?$param$'

$param 是一个PHP变量,经过过滤后只包含字母数字字符。

下面是我使用Zend select()语句实现的代码:

$db->select()
   ->from('my_table', 'entity_id')
   ->where('attribute_id IN (?)', array(541,554,555,556))
   ->where('LOWER(REPLACE(TRIM('
       . $db->quoteIdentifier('value')
       . '), "-", "")) REGEXP "([^[:space:]]* )?'
       . $param
       . '$"');

$param = 'foo' 时,实际输出的 SQL 语句为:

SELECT `entity_id` FROM `my_table` WHERE (attribute_id IN (541, 554, 555, 556)) \
AND (LOWER(REPLACE(TRIM(`value`), "-", "")) REGEXP "([^[:space:]]* )foo$")

我需要告诉where()方法不要尝试替换问号,应该怎么做?


我意识到可以使用等效的 REGEXP "([^[:space:]]* ){0,1}foo$"。但我仍然想知道在 select() 语句中是否可能使用 '?' 而不被替换。 - nachito
问题在于如何转义 ? 字符,以免被视为占位符,对吧? - David Weinraub
1个回答

3

一般而言,我认为可以将“?”字符串替换为Zend_Db_Expr('?')。

针对你的情况,我认为你需要用以下内容替换整个第二个WHERE子句:

->where(new Zend_Db_Expr('LOWER(REPLACE...'))

大致如此...

(这句话的意思是“差不多就是这样”)

我按照你的建议将整个 LOWER(REPLACE... 包装在 Zend_Db_Expr 中,但它仍然表现出相同的行为。 - nachito
@nachito:你确定这不起作用吗?我在本地尝试了一下,得到了你想要的SQL。 - David Weinraub
@DavidWeinraub 我又试了一遍,这次成功了。是我自己的错误。谢谢你们两位。 - nachito
这个问题与Magento无关,但是如果有人(就像我一样)在寻找解决此问题的方法(并且正在使用Magento),那么这对我很有效:$collection->getSelectSql()->where(new Zend_Db_Expr($yourRegexpCondition), null, Varien_Db_Select::TYPE_CONDITION);。希望能对你有所帮助! - Javier C. H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接