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.