2014-09-29 72 views
0

探查顯示了這個查詢:我如何修改這個學說查詢生成器?

SELECT 
    count(DISTINCT c0_.id) AS sclr0 
FROM 
    customers c0_ 
    LEFT JOIN customers_addresses c1_ ON c0_.id = c1_.customer_id 
    LEFT JOIN customers_phones c2_ ON c0_.id = c2_.customer_id 
WHERE 
(
    c0_.is_lead = ? 
    AND c0_.firstname LIKE ? 
) 
    OR c0_.lastname LIKE ? 
    OR c0_.email LIKE ? 
    OR c0_.company LIKE ? 
    OR c1_.street_address1 LIKE ? 
    OR c1_.street_address2 LIKE ? 
    OR c1_.city LIKE ? 
    OR c1_.state = ? 
    OR c1_.zipcode = ? 
    OR c2_.phone LIKE ? 

而且顯然不是我想要的,我希望它是這樣的:

SELECT 
    count(DISTINCT c0_.id) AS sclr0 
FROM 
    customers c0_ 
    LEFT JOIN customers_addresses c1_ ON c0_.id = c1_.customer_id 
    LEFT JOIN customers_phones c2_ ON c0_.id = c2_.customer_id 
WHERE 
(
    c0_.is_lead = ? 

) 
    AND 
    (c0_.firstname LIKE ? 
    OR c0_.lastname LIKE ? 
    OR c0_.email LIKE ? 
    OR c0_.company LIKE ? 
    OR c1_.street_address1 LIKE ? 
    OR c1_.street_address2 LIKE ? 
    OR c1_.city LIKE ? 
    OR c1_.state = ? 
    OR c1_.zipcode = ? 
    OR c2_.phone LIKE ? 
) 

我的查詢生成器看起來像這樣:

public function search($keywords = null, $lead=0){ 
    if ($keywords === null) return $this->findAllOrderedByName($lead); 

    $qb = $this->createQueryBuilder ('c') 
     ->addSelect('a') 
     ->addSelect('p') 
     ->leftJoin('c.addresses', 'a') 
     ->leftJoin('c.phones', 'p'); 
    $qb->where('c.isLead = :lead'); 

    $qb->andWhere('c.firstname like :firstname'); 
    $qb->orWhere('c.lastname like :lastname'); 
    $qb->orWhere('c.email like :email'); 
    $qb->orWhere('c.company like :company'); 

    $qb->orWhere('a.streetAddress1 like :streetAddress1'); 
    $qb->orWhere('a.streetAddress2 like :streetAddress2'); 
    $qb->orWhere('a.city like :city'); 
    $qb->orWhere('a.state = :state'); 
    $qb->orWhere('a.zipcode = :zipcode'); 
    $qb->orWhere('p.phone like :phone'); 

    $qb->setParameter('lead', $lead); 
    $qb->setParameter('firstname', '%' . $keywords . '%'); 
    $qb->setParameter('lastname', '%' . $keywords . '%'); 
    $qb->setParameter('email', '%' . $keywords . '%'); 
    $qb->setParameter('company', '%' . $keywords . '%'); 
    $qb->setParameter('streetAddress1', '%' . $keywords . '%'); 
    $qb->setParameter('streetAddress2', '%' . $keywords . '%'); 
    $qb->setParameter('city', '%' . $keywords . '%'); 
    $qb->setParameter('state', $keywords); 
    $qb->setParameter('zipcode', $keywords); 
    $qb->setParameter('phone', '%' . $keywords . '%'); 
    $qb->orderBy('c.lastname', 'ASC'); 
    return $qb; 
} 

目前,我有我的查詢構建器返回的方式的結果,即使當搜索關鍵字不匹配任何記錄,因爲的加入,我不知道我怎麼可以修改查詢b uilder方法,有什麼想法?

回答

0

你可以把它寫成

$qb->andWhere('(c.firstname like :firstname 
       OR c.lastname like :lastname 
       OR c.email like :email 
       OR c.company like :company 
       OR a.streetAddress1 like :streetAddress1 
       OR a.streetAddress2 like :streetAddress2 
       OR a.city like :city 
       OR a.state = :state 
       OR a.zipcode = :zipcode 
       OR p.phone like :phone)'); 
+0

這對我有用。謝謝 – MikeGA 2014-09-30 18:56:42

0

您是否嘗試過使用addAnd(<condition>)代替andWhere()

+0

這對我沒有工作...'addAnd '這是一個未知的方法,我使用的是教條2.2。 – MikeGA 2014-09-30 19:04:37

0

我想你可以利用orX,然後把它改寫爲..

public function search($keywords = null, $lead=0){ 
    if ($keywords === null) return $this->findAllOrderedByName($lead); 

    $qb = $this->createQueryBuilder ('c') 
     ->addSelect('a') 
     ->addSelect('p') 
     ->leftJoin('c.addresses', 'a') 
     ->leftJoin('c.phones', 'p'); 

    $qb->where(
     $qb->expr()->eq('c.isLead', ':lead') 
    )->andWhere(
     $qb->expr() 
      ->orX($qb->expr()->like('c.firstname', ':keywords')) 
      ->add($qb->expr()->like('c.lastname', ':keywords')) 
      ->add($qb->expr()->like('c.email', ':keywords')) 
      ->add($qb->expr()->like('c.company', ':keywords')) 

      ->add($qb->expr()->like('a.streetAddress1', ':keywords')) 
      ->add($qb->expr()->like('a.streetAddress2', ':keywords')) 
      ->add($qb->expr()->like('a.city', ':keywords')) 
      ->add($qb->expr()->eq('a.state', ':keywords')) 
      ->add($qb->expr()->eq('a.zipcode', ':keywords')) 

      ->add($qb->expr()->like('p.phone', 'keywords')) 
    ); 

    $qb->setParameter('lead', $lead); 
    $qb->setParameter('keywords', '%' . $keywords . '%'); 

    $qb->orderBy('c.lastname', 'ASC'); 

    return $qb; 
} 
+0

這種方法也適用於我。 – MikeGA 2014-09-30 18:57:10