DQL和多个WHERE语句

时间:2016-12-12 12:44:19

标签: symfony doctrine

我想用多个WHERE语句编写查询。

$query = $this->createQueryBuilder('s');

    $query->select('s.id,s.internalId as internal_id,s.firstName as first_name,s.lastName as last_name,st.name as store_name,sts.name as status_name')
        ->leftJoin('s.store', 'st')
       ->leftJoin('s.studentStatus', 'sts')
        ->where($query->expr()->orx(
            //$query->expr()->eq('s.store_id', ':location'),
            $query->expr()->like('s.internalId', ':internalId'),
            $query->expr()->like($query->expr()->concat($query->expr()->literal(' '), 'lower(s.firstName)'), ':name'),
            $query->expr()->like($query->expr()->concat($query->expr()->literal(' '), 'lower(s.lastName)'), ':name'),
            $query->expr()->like($query->expr()->concat($query->expr()->concat($query->expr()->literal(' '), 'lower(s.firstName)'), $query->expr()->concat($query->expr()->literal(' '), 'lower(s.lastName)')), ':name'),
            $query->expr()->like($query->expr()->concat($query->expr()->concat($query->expr()->literal(' '), 'lower(s.lastName)'), $query->expr()->concat($query->expr()->literal(' '), 'lower(s.firstName)')), ':name')
        ))
        ->setParameter('name', "%{$term}%")
        ->setParameter('internalId', "%{$internalId}")
        //->setParameter('location', "{$location}")
        ->orderBy('s.lastName', 'ASC')
        ->setMaxResults((int) $limit);

上述查询中的注释行无效。

2 个答案:

答案 0 :(得分:2)

DoctrineQueryBuilder(DQL)包含helper methods

->where($where)
->andWhere($where)
->orWhere($where)

DQL也允许构建expressions

$qb->add('select', new Expr\Select(array('u')))
   ->add('from', new Expr\From('User', 'u'))
   ->add('where', $qb->expr()->orX(
       $qb->expr()->eq('u.id', '?1'),
       $qb->expr()->like('u.nickname', '?2')
   ))
   ->add('orderBy', new Expr\OrderBy('u.name', 'ASC'));

使用where清除之前的所有where语句。

orWhere地方OR用于下一个语句。

andWhere地方AND用于下一个语句。

您应该构建类似的查询:

$query = $this->createQueryBuilder('s')
    ->select('s.id,s.internalId as internal_id,s.firstName as first_name,s.lastName as last_name,st.name as store_name,sts.name as status_name')
    ->leftJoin('s.studentStatus', 'sts')
    ->leftJoin('s.store', 'st')
    ->where('s.store_id = :location') // not working
    ->andWhere('lower(s.firstName) LIKE :name')
    ->orWhere('lower(s.lastName) LIKE :name')
    ->orWhere('s.internalId LIKE :internalId')
    ->setParameter('name', "%{$term}%")
    ->setParameter('internalId', "%{$term}%")
    ->setParameter('location', $location)
    ->orderBy('s.lastName', 'ASC')
    ->setMaxResults((int) $limit)
    ->getQuery();

答案 1 :(得分:-1)

当我们在Symfony2中使用Doctrine时最重要的事情

我们不应该使用表列名,我们必须使用实体变量名。

我在上面的Query中所犯的错误是我使用数据库列名(store_id)而不是实体列名(storeId)

Reference Source

意识到我的错误。