1

到目前为止,我建立的关系 M:N 是简单的中间表,Doctrine 不需要为此表创建实体。

我有两个实体产品和成分,它们具有如下关系 M:N 很容易用 Doctrine 描述。但真正的问题是当我需要amount在关系中存储一个字段时(我需要列出成分和数量)。

如何解决这个问题?

class Product {
     //...
     /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Ingredient", inversedBy="product")
     * @ORM\JoinTable(name="product_ingredient",
     *   joinColumns={
     *     @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="ingredient_id", referencedColumnName="id")
     *   }
     * )
     */
    private $ingredient;
     //...

class Ingredient {
    // ...
    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Product", mappedBy="ingredient")
     */
    private $product;
    // ...
4

1 回答 1

3

如果没有中间实体,你真的无法做到这一点,这就是为什么学说文档说ManyToMany关系很少见的原因。
这也是最简单的事情,只需添加RecipeItem实体,该实体将存储有关Ingredient和金额的信息并将其与关系链接ManyToOneProduct

编辑

因为我被要求提供一个例子:

class Product {
     //...
     /**
     * @ORM\OneToMany(targetEntity="RecipeItem", mappedBy="product")
     */
    private $ingredients;
     //...

class RecipeItem {
    // ...
    /**
    * @ManyToOne(targetEntity="Product", inversedBy="ingredients")
    **/
    private $product;

    /**
    * @ManyToOne(targetEntity="Ingridient")
    **/
   private $ingredient;

   /** 
    * @Column(type="decimal")
    **/ 
    private $amount;
}

class Ingredient {
    // Don't use bidirectional relationships unless you need to
    // it impacts performance
}

现在有了一个产品,您可以简单地:

foreach($product->getIngridients() as $item){
    echo "{$item->getAmount()} of {$item->getIngridient()->getName()}";
}
于 2013-08-22T10:13:11.530 回答