考虑一个多对多关系和一个将该关系显示为Collection的Form。
我想只呈现符合给定条件的关系的实体。
例子:
类别和产品是多对多的。在编辑类别时,我只想提供当前可用的产品。
当我添加另一个产品时,我需要更新所有产品。我有一个更新的产品列表,只有可用的产品,我有一个所有产品的列表,现在我必须合并这些产品,我不知道如何有效地做到这一点。
肮脏的解决方案
我心中有一个可能的解决方案,但它不是一个很好的解决方案。增加getAvailableProducts()
和setAvailableProducts()
两种方法。然而,setAvailableProducts()
方法涉及大量的计算能力,因为您需要将其与$availableProducts
进行比较。
没有更好的解决方案吗?
您可以使用Criteria
来过滤原则集合。这在文档章节8.8中有详细的解释。过滤收集 .
使用Doctrine'Common'Collections'Criteria
类来定义过滤的条件,然后可以这样做:
$filteredCollection = $collection->matching($criteria);
另一个选择是左连接实体存储库中的条件。在这种情况下,集合将根据查询中的条件仅与成员进行水合。
更新您也可以简单地在您的ProductRepository
中创建一个特殊的方法getAvailableProductsForCategory
,其中您将类别作为参数传递给该方法。
class ProductRepository extends EntityRepository
{
public function getAvailableProductsForCategory(Category $category)
{
$products = $this->createQueryBuilder('p')
->leftJoin('p.categories', 'c')
->where('p.available = true')
->andWhere('c = :category_id')
->setParameters(
array(
'category_id' => $category->getId(),
)
)
->getQuery()
->getResult();
return $products;
}
}