Доктрина и составные уникальные ключи

Я хочу сделать сложный уникальный ключ в доктрине. Это мои поля:

/** * @var string $videoDimension * * @Column(name="video_dimension", type="string", nullable=false) */ private $videoDimension; /** * @var string $videoBitrate * * @Column(name="video_bitrate", type="string", nullable=false) */ private $videoBitrate; 

Как я могу показать доктрину, что объединенные вместе являются составным уникальным ключом?

Ответ на вопрос:

 use Doctrine\ORM\Mapping\UniqueConstraint; /** * Common\Model\Entity\VideoSettings * * @Table(name="video_settings", * uniqueConstraints={ * @UniqueConstraint(name="video_unique", * columns={"video_dimension", "video_bitrate"}) * } * ) * @Entity */ 

См. @UniqueConstraint

Я считаю более целесообразным use только ORM, а затем префикс ORM в аннотации. Также обратите внимание, что вы можете разбить аннотацию на несколько строк, чтобы сделать ее более читаемой, особенно если у вас есть несколько пунктов, которые нужно упомянуть (индекс в примере ниже).

 use Doctrine\ORM\Mapping as ORM; /** * VideoSettings * * @ORM\Cache(usage="NONSTRICT_READ_WRITE") * @ORM\Entity(repositoryClass="AppBundle\Repository\VideoSettingsRepository") * @ORM\Table(name="emails", uniqueConstraints={ * @ORM\UniqueConstraint(name="dimension_bitrate", columns={"video_dimension", "video_bitrate"}) * }, indexes={ * @ORM\Index(name="name", columns={"nane"}) * }) */ class VideoSettings 

Я знаю, что это старый вопрос, но я наткнулся на него, пытаясь найти способ создания составного ПК и подумал, что может использовать какое-то обновление.

На самом деле все намного проще, если вам нужен составной первичный ключ. (Что, конечно же, гарантирует уникальность) Документация Doctrine содержит несколько хороших примеров по этому URL: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Таким образом, исходный пример может выглядеть примерно так:

 /** * @var string $videoDimension * * @ORM\Id @ORM\Column(type="string") */ private $videoDimension; /** * @var string $videoBitrate * * @ORM\Id @ORM\Column(type="string") */ private $videoBitrate; 

Несколько примечаний здесь:

  1. Столбец «name» опущен, поскольку Doctrine может угадать его на основе имени свойства
  2. Поскольку videoDimension и videoBitrate являются частью PK – нет необходимости указывать nullable = false
  3. Если требуется – составной ПК может состоять из внешних ключей, поэтому не стесняйтесь добавлять некоторые реляционные сопоставления