要搜索系统中的人员,我已在存储库中编写了一个函数。 此函数接收带有字段名称和条件的数组,并使用querybuilder来制定有效的DQL语句。
一切正常,直到我想制作一个搜索规则:
“查找属于某个域的所有人。”
... Person和Domain实体之间存在多对多关系。
根据Symfony2,关系定义正确,实际上一切都在Twig模板和控制器中有效。
该功能如下: -
private function query($extra_conditions = null)
{
$qb = $this->_em->createQueryBuilder();
$query =
$qb->select('p')
->from('AppMainBundle:Person', 'p')
->leftjoin('AppMainBundle:Domain', 'd')
->where("p.firstname IS NOT NULL")
->andWhere("p.lastname IS NOT NULL")
->andWhere("p.function IS NOT NULL");
if ($extra_conditions!=null)
{
foreach ($extra_conditions as $condition)
{
#filter on firstname
if (key($condition)=='firstname')
$query = $query->andWhere('p.firstname LIKE ?1')
->setParameter(1, $condition['firstname']);
#filter on lastname
if (key($condition)=='lastname')
$query = $query->andWhere('p.lastname LIKE ?1')
->setParameter(1, $condition['lastname']);
#filter on gender
if (key($condition)=='gender')
$query = $query->andWhere('p.gender = '.$condition['gender']);
#filter on domain(s)
if (key($condition)=='domains')
$query = $query->andWhere('d.id IN ('.$condition['domains'].')');
#filter on town
if (key($condition)=='town')
$query = $query->andWhere('p.town LIKE ?1')
->setParameter(1, $condition['town']);
}
}
$query = $query->orderBy("p.lastname", "ASC");
$query = $qb->getQuery();
return $query->getResult();
}
没有错误,但是根据搜索条件给出了任何域名;找到并返回来自所有域的人。
域名提供为类似于(2,4)的数组。
我可以更改哪些内容可以找到属于某些域的人?
答案 0 :(得分:0)
经过一些反复试验,我发现了两个可能的答案:
1)显然,在querybuilder中,您可以引用连接表中的字段,但实际上并不是实体的一部分。因此,一种解决方案是:
#filter on domain(s)
if (key($condition)=='domains')
$query = $query->andWhere('p.domain_id IN ('.$condition['domains'].')');
...其中domain_id位于由Symfony2创建的连接表“person_domain”中,而不是引擎盖。
2)现在不再需要内部联接。使用内连接也是可能的,但它写的方式错误,无论如何都不会有效。它应该写成:
->leftjoin('p:domain', 'd', 'ON p.id = d.id')
希望其他人可以从中受益。