我有两个实体,我们称之为" Girl"和"功能"。实体"女孩"与"特征"。
处于非定向的ManyToMany关系我有一个简单搜索表单的页面。我想搜索Girls by Features。在服务器端提交表单之后我得到的是功能ID列表,我应该返回的是已选择功能列表的女孩列表包含所有其他功能,该女孩
让我们来看看:
╔════════════╦═══════════════╦═══════════════╦═══════════════╗
║ ║ (1) Feature 1 ║ (2) Feature 2 ║ (3) Feature 3 ║
╠════════════╬═══════════════╬═══════════════╬═══════════════╣
║ (1) Girl 1 ║ Yes ║ Yes ║ No ║
║ (2) Girl 2 ║ Yes ║ No ║ Yes ║
╚════════════╩═══════════════╩═══════════════╩═══════════════╝
括号中的数字是实体ID。
我最初做的是:
$qbd = $this->getQbd('AppBundle:Girl', 'g')
->select('g, gf')
->leftJoin('g.features', 'gf');
从URL获取数据(特征ID)(因为使用GET方法)并将它们放入$ features数组后,我执行以下操作:
if (!empty($features)) {
$qbd->where(
$qbd->expr()->in('gf.id', ':features')
)->setParameter('features', $features);
}
尽可能简单。
一切都很好。几乎。
当我尝试搜索功能ID等于2和3的女孩时,我得到了结果两个女孩(这是好的)。可悲的是,他们每个人只有2和3的特征(对于这种情况;当我试图为他们每个人执行$ girl-> getFeatures())时,即使他们两个也应该包含对特色1。
我做错了什么?我已经尝试为这种情况构建其他更复杂的查询,但最终我们遇到了同样的问题。
答案 0 :(得分:1)
您可以使用" 会员" DQL构造。
例如你可以这样做:
$qb->from('AppBundle:Girl', 'g')
->select('g')
->andWhere(':feature MEMBER OF g.features')
->setParameter('feature', $feauture);
它只能用于单一功能。例如,如果你需要让女孩有特征A和B你需要这样做:
$qb->from('AppBundle:Girl', 'g')
->select('g')
->andWhere(':featureA MEMBER OF g.features')
->setParameter('featureA', $featureA)
->andWhere(':featureB MEMBER OF g.features')
->setParameter('featureB', $featureB);
这是我所知道的搜索集合中某个实体最干净的方法。但是,如果您需要搜索具有许多相关实体(功能)的某个实体(女孩),您将使用此方法遇到一些性能问题。在这种情况下,最好使用子查询。