我想用多个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);
上述查询中的注释行无效。
答案 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)
意识到我的错误。