首页 > 解决方案 > 带有 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 个查找器链接到原始查询。

标签: phpcakephpcakephp-4.x

解决方案


我找到了一个解决方案并在这里发布希望它可以帮助其他人。

首先,我需要干净的查询副本来创建子查询,而不会陷入无限循环。在那里,我删除了所有以前的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;
});

推荐阅读