动态查询中的查询生成器“ OR”

时间:2019-10-15 13:13:37

标签: symfony doctrine-orm doctrine-query

我想使用子句“ 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个。”

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