0

假设有一个非常基本的结构: ACategory可以包含多个项目Product

/**
 * @ORM\OneToMany(targetEntity="Product", mappedBy="category", cascade="remove")
 */
protected $products;

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
 */
protected $category;

当我通过这样的类别访问它们时,我得到了所有产品:

$category->products;

假设 aProduct有一个属性invisible。如何强制 Doctrine 仅加载可见的产品。我把这个查询放在哪里?进入存储库?但是:我如何称呼它或在“全部加载”和“加载某些”之间切换?我当然可以单独要求产品,但这似乎不是一个好的解决方案。

4

3 回答 3

1

最简单的方法是简单地将可见性参数添加到您的 category->getProducts() 方法:

class Category
{
public function getProducts($invisible = false)
{
    if ($invisible) return $this->products;

    $visibleProducts = array();
    foreach($this->products as $product)
    {
        if ($product->isVisible()) $visibleProducts[] = $product;
    }
    return $visibleProducts;
}

这不会阻止加载所有产品,但它确实为您提供了一种简单的方法来决定您想要哪些产品。而且它很容易实现。您可以稍后对其进行细化。

第二种方法是创建一个查询以使用产品加载所有类别。这将避免产品的延迟加载,并允许您准确指定您想要的产品。

最后,您可以按照@w1cked 的建议制作 D2 过滤器。需要一点努力来理解这个过程。

于 2012-12-17T21:49:50.180 回答
1

在我看来,更好的解决方案是使用 Doctrine Filters(如果您使用的是 Doctrine 2.2 或更高版本)

学说过滤器手册

您可以为您的不可见属性定义自定义过滤器,并随时通过实体管理器启用/禁用它。

于 2012-12-17T19:40:46.103 回答
0

一种解决方案是创建一个“visibleProduct”实体,使用单表继承(http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance ) 并从类别中建立第二个关系。

于 2012-12-17T15:18:26.120 回答