2015-11-07 56 views
0

我是CreateQueryBuilder的新手,我有一个非常复杂的查询,嵌套和 - >或 - >和条件。它几乎奏效(感谢Patrik Karisch),但我被一个简单而“愚蠢”的问题所阻挡。我只想在列或参数的值不为空时比较字符串列。 (注意:我不能使用if和add,我必须使用orX中的逻辑)。 $ expr-> NEQ(“s.studentEmail”,“”)总是返回我真当淡水河谷“”,但我期待虚假symfony qurybuilder比较字符串时不空

$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

我想你可能是在复杂的事情。您可以在查询之外测试您的参数,并根本跳过添加条件;

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

我也没有看到需要较低的功能,但如果你喜欢,就把它们放进去。

我开始使用表达式,因为这是文档显示的方式,但并不真正适应它们。非常详细。现在我只是写出如上所示的DQL。似乎工作原理相同,并且易于阅读。

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

+0

谢谢Cerad,我的实际查询很复杂,有几个,然后代码。 ($ expr-> andX($ expr-> neq(':email',''),$ expr-> like('lower(s.studentEmail)','lower( ('phone',''),$ expr-> like('s.homePhone',':phone')), –

+0

- >和其中('s.homePhone =:phone或s.studentMobile =:mphone或更低(s.studentEmail)=:电子邮件') –

+0

- > andWhere('s.homePhone =:phone或s.studentMobile =:mphone或更低(s.studentEmail)=:电子邮件') 我还需要检查而不是比较''(空) 如果检查所有的条件组合,将不会有很多if-else-如 if $ email!=''&& $ studentPhone!=''&& $ homePhone!='') $ query-> andWhere else if($ email!=''&& $ studentPhone!='') $ query->并在($ email!=''&& $ homePhone!='') $ query-> andWhere then然后如果($ studentPhone!=''&& $ homePhone!='') 然后,然后 每一个由他们 –