在 Cakephp 中使用 foreach 搜索多个关键字
Searching Multiple Keywords with foreach in Cakephp
这是我的代码:
$this->Product->recursive = 0;
foreach ($search_array as $value){
$search = $this->Product->find('all', array (
'contain' => array('Picture' => array('limit' => 1),
'User',
'Category',
'Vote'
),
'conditions' =>array("OR" =>
array("Product.name LIKE" => "%".$value."%",
"Product.description LIKE" => "%".$value."%")
)
));
}
$this->set('search', $search);
}
此方法returns仅最后一个关键字。例如,如果有人搜索 "mobile app",则此方法仅搜索 "app"。
如何解决这个问题?
您只使用了最后的搜索结果。您在 foreach
循环内执行搜索,但仅使用 $search
的最后一个值。在这种情况下,由于使用 $search
值,在某些情况下可能未定义(例如,当 $search_array
为空时)。
您需要使用foreach
生成LIKE
个条件,然后在查询中使用此条件。
$this->Product->recursive = 0;
$or_condition = array();
foreach ($search_array as $value){
$or_condition[] = array_merge($or_condition, array(
array("Product.name LIKE" => "%$value%"),
array("Product.description LIKE" => "%$value%")
));
}
$search = array();
if (!empty($or_condition)) {
$search = $this->Product->find('all', array (
'contain' => array(
'Picture' => array('limit' => 1),
'User',
'Category',
'Vote'
),
'conditions' => array("OR" => $or_condition)
));
}
$this->set('search', $search);
所以,当有人搜索"mobile app"时,你会出现这样的情况:
[
'contain' => [
'Picture' => array('limit' => 1),
'User',
'Category',
'Vote'
],
'conditions' => [
"OR" => [
["Product.name LIKE" => "%mobile%"],
["Product.description LIKE" => "%mobile%"],
["Product.name LIKE" => "%app%"],
["Product.description LIKE" => "%app%"]
]
]
]
这是我的代码:
$this->Product->recursive = 0;
foreach ($search_array as $value){
$search = $this->Product->find('all', array (
'contain' => array('Picture' => array('limit' => 1),
'User',
'Category',
'Vote'
),
'conditions' =>array("OR" =>
array("Product.name LIKE" => "%".$value."%",
"Product.description LIKE" => "%".$value."%")
)
));
}
$this->set('search', $search);
}
此方法returns仅最后一个关键字。例如,如果有人搜索 "mobile app",则此方法仅搜索 "app"。 如何解决这个问题?
您只使用了最后的搜索结果。您在 foreach
循环内执行搜索,但仅使用 $search
的最后一个值。在这种情况下,由于使用 $search
值,在某些情况下可能未定义(例如,当 $search_array
为空时)。
您需要使用foreach
生成LIKE
个条件,然后在查询中使用此条件。
$this->Product->recursive = 0;
$or_condition = array();
foreach ($search_array as $value){
$or_condition[] = array_merge($or_condition, array(
array("Product.name LIKE" => "%$value%"),
array("Product.description LIKE" => "%$value%")
));
}
$search = array();
if (!empty($or_condition)) {
$search = $this->Product->find('all', array (
'contain' => array(
'Picture' => array('limit' => 1),
'User',
'Category',
'Vote'
),
'conditions' => array("OR" => $or_condition)
));
}
$this->set('search', $search);
所以,当有人搜索"mobile app"时,你会出现这样的情况:
[
'contain' => [
'Picture' => array('limit' => 1),
'User',
'Category',
'Vote'
],
'conditions' => [
"OR" => [
["Product.name LIKE" => "%mobile%"],
["Product.description LIKE" => "%mobile%"],
["Product.name LIKE" => "%app%"],
["Product.description LIKE" => "%app%"]
]
]
]