Symfony querybuilder在非空时比较字符串

时间:2015-11-07 13:51:43

标签: symfony query-builder

我是CreateQueryBuilder的新手,我有一个非常复杂的查询,包含嵌套和>或 - >和条件。它几乎有效(感谢Patrik Karisch),但我被一个简单而“愚蠢”的问题所阻挡。我想仅在列或参数的值不为空时比较字符串列。 (注意:我不能使用if和add,我必须在orX中使用逻辑)。

当谷值为''时,

$expr->neq('s.studentEmail', '')总是返回true,但我期待错误

$queryBuilder = $repo->createQueryBuilder('s');
$expr = $queryBuilder->expr();
->andWhere($expr->orX(
$expr->andX($expr->neq('s.studentEmail', ''), $expr->isNotNull('s.studentEmail'), $expr->like('lower(s.studentEmail)', 'lower(:email)'),
    $expr->......

1 个答案:

答案 0 :(得分:1)

我认为你可能会让事情变得复杂。您可以在查询之外测试参数,只需跳过添加条件;

$qb = $studentRepo->createQueryBuilder('student');
if ($email) {
    $qb->andWhere('student.email LIKE %:email%');
    $qb->setParameter('email',$email);
}

我也不会看到需要更低级的功能,但如果你愿意,可以把它们放进去。

我开始使用表达式,因为这是文档显示的方式,但不是很熟悉它们。非常冗长。现在我只是编写DQL,如上所示。似乎工作相同,并且更容易阅读。

最后,您应该将您的电子邮件列定义为NOT NULL,在这种情况下,所有空电子邮件都是空字符串。或者允许它为NULL并确保空字符串始终输入为NULL。将两者混合在一起可能会使事情复杂化。