方法 _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 注入漏洞!
另见
我正在尝试将 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 注入漏洞!
另见