到目前为止,我建立的关系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;
// ...
答案 0 :(得分:3)
如果没有中间实体,你就无法做到这一点,这就是为什么教义文档说ManyToMany
关系很少见。
这也是最简单的事情,只需添加RecipeItem
实体,该实体将存储有关Ingredient
和数量的信息,并将其与ManyToOne
与Product
因为我被要求提供一个例子:
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()}";
}