Вчення і складені унікальні ключі


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;

Як я можу показати вчення про те, що поєднані разом є унікальним складовим ключем?

Відповіді:


216

Відповісти на запитання:

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
Дякуємо за інформацію ~ Як примітка, якщо ви вирішили власне запитання, хоча не можете прийняти його негайно, загалом прийнятно прийняти власну відповідь, так що якщо люди шукають, це показує, що є прийнятна відповідь.
Ріксій,

2
Чи можна це зробити за допомогою -ToOneасоціацій (зовнішніх ключів)?
Dimitry K

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

Зверніть увагу, що ви повинні вказати назви стовпців , а не назви полів. Отже, вам доведеться перетворити camelCase у snake_case і додати _idдо асоціацій, оскільки саме так Doctrine генерує імена стовпців.
гроностай

імена автогенеровані @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

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

Насправді все набагато простіше, якщо вам потрібен складений первинний ключ. (Що, звичайно, гарантує унікальність) Документація доктрини містить кілька прикладних прикладів за цією 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. За потреби - композитний ПК може складатися із зовнішніх ключів, тому сміливо додайте деякі реляційні відображення

Те, що ви зробили, - це складений первинний ключ. Звичайно, це буде унікально, але це первинний ключ ...;)
Прециель

Ну так, я думаю, що я вже згадував це у своїй відповіді :) Насправді термін "унікальний індекс" був би доречнішим у випадку ОП, якби він не мав на меті створити ПК (саме це робить прийнята відповідь). Але оскільки питання містить дивний термін «складений унікальний ключ» - я не розумію, чому ми не можемо вважати його складеним первинним ключем - принаймні це те, що я шукав, коли натрапив на це запитання. Ура!
Стас Паршин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.