【发布时间】:2012-09-18 14:01:17
【问题描述】:
我有一个 Product 类,上面有很多字段用于 ManyToMany,例如成分、尺寸、物种等。总共大约 14 个不同的字段 并非所有字段都与每个产品相关。
我有这样的映射设置
Class product {
/**
* @var Species[]
* @ORM\ManyToMany(targetEntity="Species")
* @ORM\JoinTable(name="product_species",
* joinColumns={@ORM\JoinColumn(name="productId", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="speciesId", referencedColumnName="id")}
* )
* @ORM\OrderBy({"name" = "asc"})
*/
private $species;
这非常适合多对多/多对一。
问题出在我的 product_ingredients 表中,我需要添加一个附加字段,这意味着需要从 ManyToMany 切换到 OneToMany/ManyToOne 就这样
/**
* @var ProductIngredient[]
*
* @ORM\OneToMany(targetEntity="ProductIngredient", mappedBy="product")
* @ORM\JoinColumn(name="productId", referencedColumnName="id")
*/
private $ingredients;
现在我的 ProductIngredient 实体看起来像这样
/**
* @var IngredientType
* @ORM\ManyToOne(targetEntity="IngredientType", fetch="EAGER")
* @ORM\JoinColumn(name="ingredientTypeId", referencedColumnName="id")
*/
private $ingredientType;
/**
* @var Ingredient
*
* @ORM\ManyToOne(targetEntity="Ingredient", inversedBy="products", fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="ingredientId", referencedColumnName="id")
* })
*/
private $ingredient;
/**
* @var Product
*
* @ORM\ManyToOne(targetEntity="Product", inversedBy="ingredients")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="productId", referencedColumnName="id")
* })
*/
private $product;
所以在我的物种产品类中,我使用@ORM\OrderBy 以便物种已经被订购.. 有没有办法我也可以在我的成分字段中做到这一点?
或者我做错了我的逻辑,这些甚至不应该是产品类上的字段,而应该只是在存储库中查找?
我希望它变得简单,这样我就可以遍历我的对象,例如 $product->getIngredients()
而不是做
$ingredients = $this->getDoctrine()->getRepository('ProductIngredient')->findByProduct($product->getId());
【问题讨论】:
标签: symfony doctrine-orm