2015-11-06 47 views
0

有沒有更好的方法來在Symfony 2中構建複雜的查詢? 我真正的疑問很複雜,但可以簡化爲「A和((B和C)或(B和D))」(我知道數學公式爲「A和B和(C或D)」,但我的真實查詢不能被簡化)。 我有使用和Where和orX的經驗,但我的問題是如何在'orX'中使用'和'/'expr() - >和X'。下面Symfony createQueryBuilder,如何在orx中使用'and'/'andx'

實施例(問題是在內部或X的僞碼份):

$qBuilder = $repo->createQueryBuilder('s') 
->select('s.id') 
->Where('s.FirstName = :fname') 
->Where('s.LastName = :lname') 
->andWhere($qBuilder->expr()->orX(
    (':email is not empty AND s.Email = :email'), 
    (':phone is not empty AND s.HomePhone = :phone), 
    (':phone is not empty AND s.StudentMobile = :phone), 
    (':mphone is not empty AND s.HomePhone = :mphone), 
    (':mphone is not empty AND s.StudentMobile = :mphone) 
    )) 
->setParameter('fname', strtolower($fname)) 
->setParameter('lname', strtolower($lname)) 
->setParameter('email', $email) 
->setParameter('phone', $phoneNumber) 
->setParameter('mphone', $studentmobile); 

回答

2

只需使內部的andX() EXPR。所有表達函數都是可嵌套的

->andWhere($qb->expr()->orX(
    $qb->expr()->andX(':email is not empty', 's.Email = :email'), 
    $qb->expr()->andX(':phone is not empty', 's.HomePhone = :phone'), 
    $qb->expr()->andX(':phone is not empty', 's.StudentMobile = :phone'), 
    $qb->expr()->andX(':mphone is not empty', 's.HomePhone = :mphone'), 
    $qb->expr()->andX(':mphone is not empty', 's.StudentMobile = :mphone') 
)) 
+0

另一個問題(我也開始一個新的問題)。爲什麼我總是從$ expr-> neq('s.studentEmail','')的值爲''或其他值時變爲true? –