数组键(索引)必须是唯一的
首先,(关联)中的“键”应该是唯一的,因此要努力实现这一点;
array (
'Shift.name LIKE' => '%Burberry%'
'Shift.name LIKE' => '%Butchery%'
)
与尝试这样做是一样的;
$myArray = array();
$myArray['Shift.name LIKE'] = '%Burberry%';
$myArray['Shift.name LIKE'] = '%Butchery%';
换句话说,您正在覆盖“Shift.name LIKE”键的先前值,因此您最终只会得到最后一个值;
var_dump($myArray);
//The last value has overwritten the previous one, so you'll
//only have 1 value in the array:
array(
'Shift.name LIKE' string '%Butchery%' (length=10)
)
在 CakePHP 中为不同字段创建“或”条件
您可能会感到困惑,因为在为不同字段创建“或”条件时,您可以这样做;
$results = $this->Shift->find('all', array(
'conditions' => array(
'OR' => array(
'Shift.name LIKE' => '%Burberry%',
'Shift.something' => 'something',
),
),
));
这将执行类似的操作;
SELECT *
FROM shifts AS Shift
WHERE Shift.name LIKE '%Burberry%' OR Shift.something = 'something';
但是,如果您需要对同一字段执行此操作,这将不起作用(如我回答的第一部分所述)
在 CakePHP中为单个字段创建“或”条件
正如您的评论之一所述,您正在尝试为CakePHP中的单个字段创建“或”条件。
基本上,您需要做的是创建多个关联数组并将它们包装在一个非关联数组中(实际上,这是您在第一个示例中得到的)
像这样;
array(
'OR' => array(
array('Shift.name LIKE' => '%Burberry%'),
array('Shift.name LIKE' => '%Butchery%'),
)
)
哪个可以这样使用;
$results = $this->Shift->find('all', array(
'conditions' => array(
'OR' => array(
array('Shift.name LIKE' => '%Burberry%'),
array('Shift.name LIKE' => '%Butchery%'),
),
// other conditions can be put here
// for example 'Shift.status' => 1
),
));
这将执行类似的操作;
SELECT *
FROM shifts AS Shift
WHERE Shift.name LIKE '%Burberry%' OR Shift.name LIKE '%Butchery%';
例子
以编程方式创建此数组;(我必须在这里“猜测”,你的问题不是很清楚那些“Burberry”和“Butchery”词来自哪里)
例如,有人想在您的数据库中搜索名称包含“Burberry”或“Butchery”的“Shifts”。您从表单字段中收集搜索查询并使用这些词创建一个“或”查询;
// Search-term entered by the user
// for example, obtained via $search = $this->request->query['search'];
$search = 'Burberry Butchery';
$keywords = explode(' ', $search);
$conditions = array();
foreach($keywords as $keyword) {
$conditions[] = array(
'Shift.name LIKE' => '%' . $keyword . '%'
);
}
$results = $this->Shift->find('all', array(
'conditions' => array(
'OR' => $conditions
),
));