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

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

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

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

Ответ 1

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

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

Ответ 2

Я нахожу более подробным 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

Ответ 3

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

На самом деле все намного проще, если вам нужен составной первичный ключ. (Что, конечно же, гарантирует уникальность) Документация 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;

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

  • Столбец "name" опущен, так как Doctrine может угадать его на основе имя свойства
  • Так как videoDimension и videoBitrate являются обе частями PK - нет необходимости указывать nullable = false
  • При необходимости - составной ПК может состоять из внешних ключей, поэтому не стесняйтесь добавлять некоторые реляционные сопоставления