CakePHP 或条件无法正常工作
CakePHP OR condition not properly working
我有以下问题:我有一个 table 给客户,有一个名字和一个名字。现在我在一个数组中有变量关键字(在这个例子中硬编码 2),我想检查其中一个关键字是否与名称或前缀匹配。所以我想在下面的代码片段中使用 OR 条件。不幸的是它没有提供想要的输出:
$searchValueArr = ["keyword1","keyword2"];
$customers = $customersTable->find()
->where(function (QueryExpression $exp) {
$orConditions = $exp->or_(function ($or) {
foreach($searchValueArr as $searchValue) {
$or = $or
->eq('prename LIKE', "%".$searchValue."%")
->eq('name LIKE', "%".$searchValue."%");
}
return $or;
});
return $orConditions;
})
->all();
你需要在每个匿名函数的use
部分列出$searchValueArr
,否则它不在上下文中,例如:
$searchValueArr = ["keyword1","keyword2"];
$customers = $customersTable->find()
->where(function (QueryExpression $exp) use ($searchValueArr){
$orConditions = $exp->or_(function ($or) use ($searchValueArr){
foreach($searchValueArr as $searchValue) {
$or = $or
->eq('prename LIKE', "%".$searchValue."%")
->eq('name LIKE', "%".$searchValue."%");
}
return $or;
});
return $orConditions;
})
->all();
此外,这确实是个人偏好,但从技术上讲,您仍然可以对这样的查询(一组嵌套的 OR)使用数组格式,例如:
$searchValueArr = ["keyword1","keyword2"];
$searchTerms = [];
foreach($searchValueArr as $searchValue) {
$searchTerms[] = [
'OR' => [
'prename LIKE' => "%".$searchValue."%",
'name LIKE' => "%".$searchValue."%"
]
];
}
$customers = $customersTable->find()
->where([
'OR' => $searchTerms
])
->all();
我有以下问题:我有一个 table 给客户,有一个名字和一个名字。现在我在一个数组中有变量关键字(在这个例子中硬编码 2),我想检查其中一个关键字是否与名称或前缀匹配。所以我想在下面的代码片段中使用 OR 条件。不幸的是它没有提供想要的输出:
$searchValueArr = ["keyword1","keyword2"];
$customers = $customersTable->find()
->where(function (QueryExpression $exp) {
$orConditions = $exp->or_(function ($or) {
foreach($searchValueArr as $searchValue) {
$or = $or
->eq('prename LIKE', "%".$searchValue."%")
->eq('name LIKE', "%".$searchValue."%");
}
return $or;
});
return $orConditions;
})
->all();
你需要在每个匿名函数的use
部分列出$searchValueArr
,否则它不在上下文中,例如:
$searchValueArr = ["keyword1","keyword2"];
$customers = $customersTable->find()
->where(function (QueryExpression $exp) use ($searchValueArr){
$orConditions = $exp->or_(function ($or) use ($searchValueArr){
foreach($searchValueArr as $searchValue) {
$or = $or
->eq('prename LIKE', "%".$searchValue."%")
->eq('name LIKE', "%".$searchValue."%");
}
return $or;
});
return $orConditions;
})
->all();
此外,这确实是个人偏好,但从技术上讲,您仍然可以对这样的查询(一组嵌套的 OR)使用数组格式,例如:
$searchValueArr = ["keyword1","keyword2"];
$searchTerms = [];
foreach($searchValueArr as $searchValue) {
$searchTerms[] = [
'OR' => [
'prename LIKE' => "%".$searchValue."%",
'name LIKE' => "%".$searchValue."%"
]
];
}
$customers = $customersTable->find()
->where([
'OR' => $searchTerms
])
->all();