Doctrine查询生成器-无法生成具有非字符串列名称的IN

问题描述 投票:1回答:1

因此,我无法入睡,我要么想念一些确实很明显的东西,要么不能那样做。

我有这个学说查询生成器:

    $this->queryBuilder
        ->where('entity.id != ' . $id)
        ->andWhere(
            $this->queryBuilder->expr()->andX(
                $this->queryBuilder->expr()->in(":validatedValue", ['slug', 'title', 'content'])
            )
       )
       ->setParameter('validatedValue', $value);

现在它会产生类似这样的内容:

SELECT
    p0_.id AS id_0,
    p0_.title AS title_1,
    p0_.teaser AS teaser_2,
    p0_.content AS content_3,
    p0_.slug AS slug_4
FROM
    posts p0_
WHERE
    p0_.id <> 1
    AND 'my-string-value-something something' IN('slug', 'title', 'content')

我对此特定行有问题:

AND 'my-string-value-something something' IN('slug', 'title', 'content')

我希望能够检查实际的列,所以我必须产生这样的内容:

AND 'my-string-value-something something' IN(slug, title, content)

您已经注意到我想要的正确版本,如果可以的话,它在字段名称周围没有引号。如果它们在那里,它将被视为字符串,而不是表中的实际列。

我似乎无法使用此查询生成器生成该代码。我尝试了各种技巧并嵌套了expr(),但没有任何尝试起作用。

有人完全不知道我如何与建筑商合作吗?我可以使用构建器来做到这一点,还是应该仅使用DQL或纯SQL?

php mysql symfony doctrine-orm doctrine
1个回答
0
投票

关于我想做的事情,我已经发现,以一种想做的方式根本不可能。

我认为,从理论上讲,该学说将始终将数组中的元素括在引号中。我认为无法将其关闭。即使有一些巧妙的不同处理方式,对于这种简单的事情来说似乎也花费了太多精力。

/**
     * Creates an IN() expression with the given arguments.
     *
     * @param string $x Field in string format to be restricted by IN() function.
     * @param mixed  $y Argument to be used in IN() function.
     *
     * @return Expr\Func
     */
    public function in($x, $y)
    {
        if (is_array($y)) {
            foreach ($y as &$literal) {
                if ( ! ($literal instanceof Expr\Literal)) {
                    $literal = $this->_quoteLiteral($literal);
                }
            }
        }

        return new Expr\Func($x . ' IN', (array) $y);
    }

这正是我从教义中得到不必要的报价的方式。

$literal = $this->_quoteLiteral($literal);

关于我如何解决我的问题,我完全按照@Bananaapple在帖子评论中的建议进行了操作。所以现在我的代码看起来像这样:

// build conditions to determine which fields should be checked for the value
foreach ($constraint->fields as $field) {
    $fieldsConditions[] = $this->queryBuilder->expr()->eq('entity.' . $field, ':value');
}


// we should always have fields as this is taken care of before we even get to this point
if (!empty($fieldsConditions)) {
    $this->queryBuilder->andWhere(
        $this->queryBuilder->expr()->orX(...$fieldsConditions)
    )->setParameter('value', $value);
 }

我希望这会对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.