如果字段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.'%');
答案 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数组,