метод _or в Cake \ Database \ Expression \ QueryExpression, дающий 'И' вместо 'ИЛИ', когда я вызывал метод sql () - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь добавить оператор запроса SQL SQL ИЛИ в мой проект CakePHP, но обратите внимание, что я получаю И вместо ИЛИ.

Я получаю эту строку, когда использую 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 я получаюА ТАКЖЕ.

Почему это так работает и как мне этого избежать?

//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();

1 Ответ

0 голосов
/ 10 июня 2019

Объекты внутреннего выражения обычно не влияют на объекты внешнего выражения, т. Е. Основное выражение на самом деле не заботится о том, какой тип выражения вы ему передаете.

То, что вы делаете там, создает 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);

пс, делать НЕ делать такие вещи, как 'platform='. $platform, это возможная уязвимость SQL-инъекций!

Смотри также

...