M:N与更多字段的关系

时间:2013-08-22 09:42:15

标签: symfony orm doctrine-orm

到目前为止,我建立的关系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;
    // ...

1 个答案:

答案 0 :(得分: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()}";
}