Symfony 如何修改此条令查询生成器?

Symfony 如何修改此条令查询生成器?,symfony,doctrine-orm,Symfony,Doctrine Orm,探查器显示此查询: 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 LIK

探查器显示此查询:

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;
}
我的查询生成器如下所示:

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;
}

我目前让我的查询生成器返回结果的方式,即使搜索关键字由于连接而与任何记录不匹配,我也不知道如何修改查询生成器方法,有什么想法吗?

您是否尝试使用
addAnd()
而不是
和where()

您可以将其编写为

$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)');

我想你可以使用
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;
}

这对我不起作用<代码>添加和这是一种未知的方法,我使用的是条令2.2。