方法 _or 在 Cake\Database\Expression\QueryExpression 中给出 'AND' 而不是 'OR' 当我调用 sql() 方法时

method _or in Cake\Database\Expression\QueryExpression giving 'AND' Instead of 'OR' when i called sql() method

我正在尝试将 OR SQL 查询语句添加到我的 CakePHP 项目中,但请注意我得到的是 AND 而不是 OR。

我在使用 SQL() 时得到这个字符串,但没有包含 OR 而 OR 是预期的

SELECT Blacklist.id AS `Blacklist__id`, 
       Blacklist.provider AS `Blacklist__provider`, 
       Blacklist.receiver AS `Blacklist__receiver`, 
       Blacklist.platform AS `Blacklist__platform`, 
       Blacklist.brokers AS `Blacklist__brokers` 
FROM blacklist Blacklist 
WHERE (brokers = :c0 AND provider = :c1 AND platform=FXCMMetaTrader4)

我尝试了下面的代码,但是我得到的不是 OR,而是 AND。

为什么会这样,我该如何避免?

//fill blacklist data
  $blacklistQuery  = $blacklistModel->find()
            ->select(['id', 'provider', 'receiver', 'platform', 'brokers'])
            ->order(array('created' => 'desc'))
            ->where(function (QueryExp $exp, Query $q) use ($accountBroker, $accountLogin,$platform) {
                $orBrokerCond = $exp->or_(['brokers' => $accountBroker]);
                $orProviderCond = $exp->or_(['provider' => $accountLogin]);
                $orPlatformCond = $exp->or_('platform='. $platform);

                return $exp->add($orBrokerCond)
                    ->add($orProviderCond)
                    ->add($orPlatformCond);
            });

        // ->where("provider = $accountLogin");

echo $blacklistQuery->sql();

内部表达式对象通常不会影响外部表达式对象,即主表达式并不真正关心您传递给它的表达式类型。

您正在做的是创建 3 个单独的表达式对象,每个对象只包含一个条件。这些对象中的每一个都将自身编译为一个条件语句,然后这些语句将使用 AND 连接起来,因为您将它们传递给默认使用 AND 的主表达式。

您要创建的内容可以简单地表示为:

return $exp->or_([
    'brokers' => $accountBroker,
    'provider' => $accountLogin,
    'platform' => $platform,
]);

如果你在哪里添加 OR 条件到另一个表达式,那么你将传递一个具有多个条件的对象,即:

$or = $exp->or_([
    'brokers' => $accountBroker,
    'provider' => $accountLogin,
    'platform' => $platform,
]);

return $exp->add($or);

ps,不要'platform='. $platform 之类的事情,这可能是 SQL 注入漏洞!

另见