CakePHP LIKE语句?

时间:2013-07-08 16:47:36

标签: mysql cakephp

如果字段gp_categories包含字符串'12 56 34 345 349',如何找到包含数字34的记录?

$id = 34;

// 1. Works but is there a more efficient way?
$q['conditions']['OR'] = array(
    array('Groups.gp_categories LIKE' => $id), // Only
    array('Groups.gp_categories LIKE' => $id.' %'), // Start
    array('Groups.gp_categories LIKE' => '% '.$id.' %'), // Middle
    array('Groups.gp_categories LIKE' => '% '.$id) // End
);

// 2. Finds either 34, 345, 349 etc
$q['conditions'] = array('Groups.gp_categories LIKE' => '%'.$id.'%');

3 个答案:

答案 0 :(得分:2)

我在数据库端使用正则表达式

 $q['conditions'] = array("Groups.gp_categories REGEXP" => "[[:<:]]".$id."[[:>:]]");

(那是mysql,顺便说一下,如果你正在使用另一个数据库,你需要改变它。)

您可以将该查找包装在模型函数中,或者如果它未在其他地方重复使用,则将其保留在控制器中。

实施例

public function getByCategory($id) {
    return $this->find('all', array('conditions'=> 
           array("Groups.gp_categories REGEXP" => "[[:<:]]".$id."[[:>:]]")));
}

//in controller
$this->YourModel->getByCategory($id);

我不知道蛋糕中是否有更高效的功能,所以很可能没有。此外,你必须测试数据库中的正则表达式是否比你已经使用的LIKE查询更有效,我还没有对它进行基准测试。但它应该比4个人更有效率。

答案 1 :(得分:0)

试试这个

   $gp_categories = '12 56 34 345 349' ;
    if (strpos($gp_categories,'34') !== false) {
    echo 'true';
    }

答案 2 :(得分:0)

Using Locate

LOCATE的工作原理如下:

LOCATE(<string to find>, <string to find it in>)

LOCATE(<string to find>, <string to find it in>, <position to start at>)

例如,要找到字符串“apples oranges pears bananas apple oranges”中“oranges”的位置,请执行以下操作:

SELECT LOCATE("oranges", "apples oranges pears bananas apples oranges");

这将返回8.要查找源字符串中下一个“oranges”的出现,请将第三个参数传递给函数,告诉它在此示例中从位置9开始:

SELECT LOCATE("oranges", "apples oranges pears bananas apples oranges", 9);

现在将返回37.请注意,在这些示例中,如果已将8作为起始位置传递,那么将返回8。

要更多地使用此功能,您可以refer link

但你需要把它转换成cakephp数组,