Doctrine2 сущностные отношения - PullRequest
0 голосов
/ 15 ноября 2011

Я новичок в Symfony2 (пару лет назад использовал symfony 1.x) и пытаюсь понять, как обращаться с сущностями с помощью Doctrine2. (Кстати, было бы неплохо, если бы в книге Symfony2 было больше примеров взаимоотношений, вместо того, чтобы просто ссылаться на документы Doctrine2: -)

Таким образом, у меня есть простая сущность продукта, которую я хочу связать с несколькими категориями (то есть один продукт может быть в нескольких категориях). На первый взгляд, это похоже на отношения типа «один ко многим», но я думаю, что такие отношения будут сделаны через таблицу соединений в базе данных. Поэтому я делаю что-то вроде этого:

class Product
{
  ....

  /**
   * @ORM\ManyToMany(targetEntity="Category");
   **/
  private $categories;

}

Обновление схемы действительно создает таблицу соединения в базе данных, как и ожидалось. Но я задаюсь вопросом, не ошибаюсь ли я, сделав это вместо многих многим? Я предполагаю, что я спрашиваю о лучших методах и как бы вы это сделали? Кто-нибудь может посоветовать и / или привести примеры?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Ваше предложение "один товар может быть в нескольких категориях" верно, но это также верно: "несколько товаров могут быть в нескольких категориях". Это потому, что вы не используете хорошие предложения, которые:

  • "категория может иметь много товаров"
  • "продукт может иметь много категорий"

Это означает, что у вас есть отношения многие ко многим.

Если бы это было

  • "категория может иметь много товаров"
  • "продукт может иметь только одну категорию"

Тогда у вас будут отношения один-ко-многим и многие-к-одному.

0 голосов
/ 15 ноября 2011

Если вы хотите много-много отношений, вам понадобится промежуточная таблица

class Product
{
    /**
     * @ManyToMany(targetEntity="Categories")
     * @JoinTable(name="Product_Category",
     *      joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="Category_id", referencedColumnName="id")}
     *      )
     */
    private $categories;
}
...