Symfony Forms,过滤要显示的嵌入表单集合


Symfony Forms, filter the Embedded Collection of Forms to be showed

考虑一个多对多关系和一个将该关系显示为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;
    }
}