OneToMany/ManyToOneでOrderByを使用する方法 質問する

OneToMany/ManyToOneでOrderByを使用する方法 質問する

成分、サイズ、種類など、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;

これは、manytomany/manyto one に最適です。

問題は、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());

ベストアンサー1

Productエンティティでは、orderByをingredients関係に追加するだけです。

/**
 * @ORM\OrderBy({"some_attribute" => "ASC", "another_attribute" => "DESC"})
 */
private $ingredients;

PHP 8 属性の場合:

#[ORM\OrderBy(['some_attribute' => 'ASC', 'another_attribute' => 'DESC'])]
private $ingredients;

おすすめ記事