我最终发现我可以简单地明确使用准备好的语句:
<?php
$query = array('OR' => array(
array(
'Post.title LIKE ?' => array(
'%' . $this->escapeLike('100%') . '%'),
),
),
array(
'Post.title LIKE ?' => array(
'%' . $this->escapeLike('red_apples') . '%'),
),
),
);
...或者,当 DBMS 没有默认分隔符或者我们更喜欢设置我们的分隔符时:
<?php
$separator = '|';
$query = array('OR' => array(
array(
'Post.title LIKE ? ESCAPE ?' => array(
'%' . $this->escapeLike('100%', $separator) . '%'),
$separator
),
),
array(
'Post.title LIKE ? ESCAPE ?' => array(
'%' . $this->escapeLike('red_apples', $separator) . '%'),
$separator
),
),
);
我的escapeLike()
方法目前是这样的(这从来都不是困难的部分):
/**
* Escapes LIKE wildcard characters
*
* @param string $text
* @param string $escape_character
* @return string
*/
protected function escapeLike ($text, $escape_character='\\') {
return strtr($text, array(
'%' => $escape_character . '%',
'_' => $escape_character . '_',
$escape_character => $escape_character . $escape_character,
));
}
为了简单起见,我实现了它AppModel
(至少在我的项目中)。
这适用于带有 MySQL 适配器的 CakePHP/2.5(不知道其他场景)。