因此,我无法入睡,我要么想念一些确实很明显的东西,要么不能那样做。
我有这个学说查询生成器:
$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?
关于我想做的事情,我已经发现,以一种想做的方式根本不可能。
我认为,从理论上讲,该学说将始终将数组中的元素括在引号中。我认为无法将其关闭。即使有一些巧妙的不同处理方式,对于这种简单的事情来说似乎也花费了太多精力。
/**
* 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);
}
我希望这会对某人有所帮助。