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?

Nikoole
źródło

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

Nikoole
źródło
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
luchaninov
źródło
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
Staś Parshyn
źródło
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