Doctrine Symfony原则一对多andX查询生成器
我有一个产品实体,它有一个多属性值。每个AttributeValue都有一个属性关系和一个“值”参数 我想过滤同时具有“颜色”(属性)“黑色”(值)和“尺寸”的产品 当然,只有当只给出一个属性时,这才有效。如果过滤器数组包含多个值,则不会给出任何结果。可能是因为它希望满足同一AttributeValue对象上的所有条件,而不是寻找至少满足一个条件的所有AttributeValue对象。但我的最终目标是找到同时具有所有给定属性的对象。但是我不知道如何在查询生成器中声明Doctrine Symfony原则一对多andX查询生成器,doctrine,query-builder,Doctrine,Query Builder,我有一个产品实体,它有一个多属性值。每个AttributeValue都有一个属性关系和一个“值”参数 我想过滤同时具有“颜色”(属性)“黑色”(值)和“尺寸”的产品 当然,只有当只给出一个属性时,这才有效。如果过滤器数组包含多个值,则不会给出任何结果。可能是因为它希望满足同一AttributeValue对象上的所有条件,而不是寻找至少满足一个条件的所有AttributeValue对象。但我的最终目标是找到同时具有所有给定属性的对象。但是我不知道如何在查询生成器中声明 谢谢大家! 我找到了解决办法
谢谢大家! 我找到了解决办法。也许这不是最好的,但它很管用 我首先将我的属性连接起来并计数
$qb->from($this->_entityName, 'product')
$qb->addSelect('product')
$qb->innerJoin("product.attributes","attributes");
$qb->addSelect('COUNT(attributes.id) AS attributesCount');
$qb->groupBy('product.id');
然后我添加一个orX而不是andX,以获得至少具有一个属性的所有产品
$orX = $qb->expr()->orX();
$count = 0;
foreach($params['filters'] as $att_id => $values) {
foreach ($values as $val){
$orX->add("attributes.attribute = :att_id_".$count." and attributes.value = :val_".$count);
$qb->setParameter("att_id_".$count, $att_id);
$qb->setParameter("val_".$count, $val);
$count++;
}
}
$qb->andWhere($orX);
$qb->having("attributesCount = :ac");
$qb->setParameter("ac", $count);
最后,我确保只返回计算所有已定义属性的值。筛选出不具备所有属性的产品
$orX = $qb->expr()->orX();
$count = 0;
foreach($params['filters'] as $att_id => $values) {
foreach ($values as $val){
$orX->add("attributes.attribute = :att_id_".$count." and attributes.value = :val_".$count);
$qb->setParameter("att_id_".$count, $att_id);
$qb->setParameter("val_".$count, $val);
$count++;
}
}
$qb->andWhere($orX);
$qb->having("attributesCount = :ac");
$qb->setParameter("ac", $count);