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


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

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

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

Author: Cœur, 2012-09-28

3 answers

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

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

 165
Author: Nikoole, 2018-09-12 10:02:32

Я нахожу более подробным 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
 16
Author: luchaninov, 2015-11-12 10:14:15

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

На самом деле все намного проще, если вам нужен составной первичный ключ. (Что, конечно, гарантирует уникальность) Документация по доктрине содержит несколько хороших примеров по этому 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. Столбец "имя" опущен, так как Доктрина может угадать его на основе имени свойства
  2. Поскольку videoDimension и videoBitrate являются частями PK - нет необходимости указывать nullable = false
  3. При необходимости - составной ПК может состоять из внешних ключей, поэтому не стесняйтесь добавлять некоторые реляционные сопоставления
 1
Author: Stas Parshin, 2017-07-12 19:54:33