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


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

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

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

3 80

3 ответа:

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

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

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

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