35

材料、サイズ、種など、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());
4

4 に答える 4

80

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

/**
 * ...
 * @ORM\OrderBy({"some_attribute" = "ASC", "another_attribute" = "DESC"})
 */
private $ingredients;
于 2012-09-19T13:45:46.357 に答える
6

さて、私はハックな方法を思いつきました..私は本当に出力の並べ替えだけを気にするので、基本的な小枝拡張を作成しました

use Doctrine\Common\Collections\Collection;

public function sort(Collection $objects, $name, $property = null)
{
    $values = $objects->getValues();
    usort($values, function ($a, $b) use ($name, $property) {
        $name = 'get' . $name;
        if ($property) {
            $property = 'get' . $property;
            return strcasecmp($a->$name()->$property(), $b->$name()->$property());
        } else {
            return strcasecmp($a->$name(), $b->$name());
        }
    });
    return $values;
}

私はこのハックを避けたいと思っていますが、実際の解決策を知りたいです

于 2012-09-20T02:27:01.440 に答える