Doktryna i złożone unikalne klucze


96

Chcę zrobić złożony, unikalny klucz w doktrynie. To są moje pola:

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

Jak mogę pokazać doktrynę, że te połączone razem stanowią złożony unikalny klucz?

Odpowiedzi:


217

Odpowiedz na pytanie:

use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * Common\Model\Entity\VideoSettings
 *
 * @Table(name="video_settings", 
 *    uniqueConstraints={
 *        @UniqueConstraint(name="video_unique", 
 *            columns={"video_dimension", "video_bitrate"})
 *    }
 * )
 * @Entity
 */

Zobacz @UniqueConstraint


3
Dziękuję za informacje ~ Uwaga: jeśli rozwiązałeś własne pytanie, chociaż nie możesz od razu zaakceptować, ogólnie jest to dobra forma, aby zaakceptować własną odpowiedź, tak więc jeśli ludzie szukają, pokazuje się, że istnieje akceptowalna odpowiedź.
Rixius

2
Czy można to zrobić za pomocą -ToOneskojarzeń (kluczy obcych)?
Dimitry K

5
Wiem, że to stary post, ale @Dimitry K jest to możliwe. Wystarczy, że użyjesz nazwy kolumny, takiej jak w @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Oto „join_table_id”.
herr

Pamiętaj, że musisz podać nazwy kolumn , a nie nazwy pól. Musisz więc przekonwertować camelCase na snake_case i dodać _idskojarzenia, ponieważ w ten sposób Doctrine generuje nazwy kolumn.
gronostaj

imiona są generowane automatycznie @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})i nic innego się nie
liczy

18

Uważam, że jest to bardziej rozwlekłe niż useORM, a następnie prefiks ORMw adnotacjach. Pamiętaj również, że możesz podzielić adnotację na kilka wierszy, aby uczynić ją bardziej czytelną, zwłaszcza jeśli masz kilka elementów, o których warto wspomnieć (indeks w przykładzie poniżej).

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

Wiem, że to stare pytanie, ale natknąłem się na nie, szukając sposobu na stworzenie złożonej PK i pomyślałem, że przydałoby się trochę aktualizacji.

Rzeczy są faktycznie znacznie prostsze, jeśli potrzebujesz złożonego klucza podstawowego. (Co oczywiście gwarantuje wyjątkowość) Dokumentacja Doctrine zawiera kilka fajnych przykładów z tego adresu URL: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Więc oryginalny przykład mógłby wyglądać mniej więcej tak:

/**
 * @var string $videoDimension
 *
 * @ORM\Id @ORM\Column(type="string")
 */
private $videoDimension;

/**
 * @var string $videoBitrate
 *
 * @ORM\Id @ORM\Column(type="string")
 */
private $videoBitrate;

Kilka uwag:

  1. Kolumna „nazwa” jest pomijana, ponieważ Doctrine może ją odgadnąć na podstawie nazwy właściwości
  2. Ponieważ obie części PK są videoDimensioni videoBitratesą - nie ma potrzeby określanianullable = false
  3. W razie potrzeby - złożony PK może składać się z kluczy obcych, więc możesz dodać kilka mapowań relacyjnych

To, co zrobiłeś, to złożony klucz podstawowy. Pewnie, że będzie wyjątkowy, ale to klucz podstawowy ...;)
Preciel

Cóż, tak, myślę, że wspomniałem o tym w mojej odpowiedzi :) Właściwie termin „unikalny indeks” byłby bardziej odpowiedni w przypadku OP, gdyby nie miał zamiaru tworzyć PK (tak robi zaakceptowana odpowiedź). Ale ponieważ pytanie zawiera dziwny termin „złożony klucz unikalny” - nie rozumiem, dlaczego nie możemy założyć, że jest to złożony klucz podstawowy - przynajmniej tego szukałem, kiedy natknąłem się na to pytanie. Twoje zdrowie!
Stas Parshyn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.