php - 带有 OR 条件的 CakePHP 链自定义查找器
问题描述
如何使用OR
条件链接自定义查找器?我有一种beforeFind()
检查权限的方法。
if (isset($access->corporate)) {
$query->find('forCorporate', ['corporate_id' => $access->corporate]);
}
if (isset($access->company)) {
$query->find('forCompany', ['company_id' => $access->company]);
}
我需要用 OR 条件将上面的 2 个查找器链接到原始查询。
解决方案
我找到了一个解决方案并在这里发布希望它可以帮助其他人。
首先,我需要干净的查询副本来创建子查询,而不会陷入无限循环。在那里,我删除了所有以前的WHERE
条件。
然后我where()
使用回调方法调用原始查询。这使我可以操作QueryExpression
.
因为我想用OR
条件链接自定义查找器查询,所以我需要一个起始条件,总是错误的,这就是我1 = 0
有条件的原因。然后我可以使用QueryExpression
'sadd()
方法来链接查询。
$cleanQueryCorporate = $query->cleanCopy()
->select(['Accounts.id'])->where(null, [], true);
$cleanQueryCompany = $query->cleanCopy()
->select(['Accounts.id'])->where(null, [], true);
$query->where(function (QueryExpression $exp) use ($access, $cleanQueryCorporate, $cleanQueryCompany, $options) {
$exp = $exp->or('1 = 0'); // this needed to add the next ones with OR
if (isset($access->corporate)) {
$exp = $exp->add(['Accounts.id IN'=> $cleanQueryCorporate
->find('forCorporate', ['corporate_id' => $access->corporate])]);
}
if (isset($access->company)) {
$exp = $exp->add(['Accounts.id IN'=> $cleanQueryCompany
->find('forCompany', ['company_id' => $access->company])]);
}
return $exp;
});
推荐阅读
- google-docs - 有什么方法可以知道同一张表是否在 google doc 中呈现为多个页面?
- swift - 初学者遇到了 NSScreen.screens 的问题
- pattern-matching - 如何在 OCaml 中输出一个空元组作为函数的一部分?
- javascript - 无法从列表中删除组件(React Hook)
- ios - Xcode 自动完成功能在 SwiftUI 中不起作用
- python - 为什么这里使用这个 ValueError 异常而不是 TypeError 异常?
- java - 有没有办法检查有多少数据加载到缓冲区中?
- bash - 有没有办法让一组 if 语句在所有数组元素上运行?
- android - Kotlin - 将 layoutDirection 设置为 linearlayout 错误绑定
- php - 继续在后台运行 Twitter 流 API