Уникальные идентификаторы в таблице соединений symfony2

У меня есть два продукта и категории объектов, я успешно создал много-много отношений b / w их, в результате была создана новая таблица, которая выглядит так:

┌────────────────┐ ┌───────────────────┐ ┌────────────────┐ | products | | product_categories| | categories | ├────────────────┤ ├───────────────────┤ ├────────────────┤ | id# ├---------┤ product_id | ┌----┤ id# | | -- | | cat_id ├----┘ | -- | | -- | | | | | └────────────────┘ └───────────────────┘ └────────────────┘ 

категории

  /** * @ORM\ManyToMany(targetEntity="Products", mappedBy="category") */ protected $product; 

Продукты

  /** * @ORM\ManyToMany(targetEntity="categories", inversedBy="product") * @ORM\JoinTable(name="product_categories", * joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="cat_id", referencedColumnName="id")} * ) **/ protected $category; 

Теперь я хочу, чтобы продукт и cat_id были уникальными в таблице product_categories. как это можно сделать?

Solutions Collecting From Web of "Уникальные идентификаторы в таблице соединений symfony2"

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

Если вы укажете свои ассоциации «многие ко многим» явно через дополнительный объект (скажем, ProductCategories ), вы можете просто добавить ограничение UniqueEntity.

Документация об ограничении уникальности

Пример с аннотациями:

 use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity * (...) * @UniqueEntity(fields={"product_id", "cat_id"}) */ class ProductCategories { // (...) 

редактировать:

Кроме того, убедитесь, что вы правильно создали свою базу данных. Вы должны использовать команды Doctrine для этого (не делайте это вручную!):

 php -f ./app/console doctrine:database:drop php -f ./app/console doctrine:database:create php -f ./app/console doctrine:schema:create 

Таким образом, на основе ваших сущностей Doctrine создаст соответствующую db-схему. Если вы что-то измените в будущем (в своих сущностях), вы сможете просто обновить свою схему:

 php -f ./app/console doctrine:schema:update --force 

(с большинством вышеперечисленных команд вы также можете добавить аргумент --dump-sql который приводит к отображению только sql вместо изменения вашей базы данных)