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


96

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

/**
 * @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;

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

Ответы:


217

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

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


3
Спасибо за информацию ~ В качестве примечания: если вы решили свой собственный вопрос, хотя вы не можете принять его сразу, как правило, это хорошая форма, чтобы принять свой собственный ответ, просто так, если люди ищут, это показывает, что есть приемлемый ответ.
Rixius

2
Можно ли это сделать с помощью -ToOneассоциаций (внешних ключей)?
Dimitry K

5
Я знаю, что это старый пост, но @Dimitry K это возможно. Просто вам нужно использовать имя столбца, как в вашем @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Вот "join_table_id".
herr

Обратите внимание, что вы должны указывать имена столбцов , а не поля. Поэтому вам нужно преобразовать camelCase в snake_case и добавить _idдля ассоциаций, потому что именно так Doctrine генерирует имена столбцов.
gronostaj 06

имена @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})
генерируются

18

Я считаю более подробным 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={"name"})
 * })
 */
class VideoSettings

2

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

На самом деле все намного проще, если вам нужен составной первичный ключ. (Что, конечно, гарантирует уникальность) Документация 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являются обеими частями ПК, указывать не нужно.nullable = false
  3. При необходимости составной PK может состоять из внешних ключей, поэтому не стесняйтесь добавлять реляционные сопоставления.

Вы сделали составной первичный ключ. Конечно, он будет уникальным, но это первичный ключ ...;)
Preciel

Ну да, я думаю, что упомянул об этом в своем ответе :) На самом деле термин «уникальный индекс» был бы более уместным в случае OP, если бы он не имел в виду создавать PK (это то, что делает принятый ответ). Но поскольку вопрос содержит странный термин «составной уникальный ключ» - я не понимаю, почему мы не можем предположить, что это составной первичный ключ - по крайней мере, это то, что я искал, когда наткнулся на этот вопрос. Ура!
Стас Паршин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.