我是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->......
答案 0 :(得分:1)
我认为你可能会让事情变得复杂。您可以在查询之外测试参数,只需跳过添加条件;
$qb = $studentRepo->createQueryBuilder('student');
if ($email) {
$qb->andWhere('student.email LIKE %:email%');
$qb->setParameter('email',$email);
}
我也不会看到需要更低级的功能,但如果你愿意,可以把它们放进去。
我开始使用表达式,因为这是文档显示的方式,但不是很熟悉它们。非常冗长。现在我只是编写DQL,如上所示。似乎工作相同,并且更容易阅读。
最后,您应该将您的电子邮件列定义为NOT NULL,在这种情况下,所有空电子邮件都是空字符串。或者允许它为NULL并确保空字符串始终输入为NULL。将两者混合在一起可能会使事情复杂化。