材料、サイズ、種など、ManyToMany 用の多くのフィールドを持つ Product クラスがあります。合計で約 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());