我想使用子句“ OR”构建查询,并且该查询接收一个数组参数,并且不知道其包含的元素。
查询必须返回目录类别为“ 1”或“ 2”的目录(如果$ categ数组包含[1,2])等。 类别是内容实体中的外键。
我的存储库:
define([
'uiComponent'
], function (Component) {
'use strict';
// var show_hide_custom_blockConfig = window.checkoutConfig.quoteData.entity_id;
var up_selling_products = window.checkoutConfig.up_selling_product.up_selling_product;
return Component.extend({
defaults: {
template: 'MyModule/checkout/shipping/additional-block'
},
upSellingProducts: up_selling_products ,
});
});
我收到错误消息“参数太多:查询定义了1个参数,而您绑定了2个。”
答案 0 :(得分:1)
从PHP 5.6起,您可能可以使用PHP splat ...
将数组扩展为参数。
$query = $this->createQueryBuilder('c');
$expr = $query->expr();
$conditions = [];
$valueNo = 0;
foreach ($categs as $value) {
$conditions[] = $expr->eq('c.contentCategory', 'value'.$valueNo);
$query->setParameter('value'.$valueNo, $value);
$valueNo++;
}
$query->andWhere($expr->orX(...$conditions));
免责声明:我尚未对此进行测试。
请参阅:https://www.php.net/manual/en/functions.arguments.php
调用函数将数组或Traversable变量或文字解压缩到参数列表中时,也可以使用...:
编辑:
如果查询很简单,则可以改用orWhere
。
$query = $this->createQueryBuilder('c');
$expr = $query->expr();
$valueNo = 0;
foreach ($categs as $value) {
$query->orWhere($expr->eq('c.contentCategory', 'value'.$valueNo));
$query->setParameter('value'.$valueNo, $value);
$valueNo++;
}
编辑2:
您甚至可能只想使用in
子句。
$query->where($expr->in('c.contentCategory', ':values'));
$query->setParameter('values', $categs);`
答案 1 :(得分:0)
您可以很容易地实现这一点,下面利用查询构建器表达式构建器:
$queryBuilder = $this->createQueryBuilder('c');
$conditions = [];
$i = 0;
foreach ($categs as $value) {
$i++;
$conditions[] = $queryBuilder->expr()->eq('c.contentCategory', $i);
$queryBuilder->setParameter($i, $value);
}
$queryBuilder->andWhere(
$queryBuilder->expr()->orX()->addMultiple($conditions)
);
如果您的参数适用于所有人,则只需添加
$queryBuilder->setParameter();