Доктрина и составные уникальные ключи
Я хочу сделать составной уникальный ключ в учении. Это мои поля:
/**
* @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
- При необходимости - составной ПК может состоять из внешних ключей, поэтому не стесняйтесь добавлять некоторые реляционные сопоставления