Pytanie Unikalne klawisze doktryny i kompozytów


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 są złożonym kluczem unikatowym?


76
2017-09-28 14:11


pochodzenie




Odpowiedzi:


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

Widzieć @UniqueConstraint


160
2017-09-29 07:57



Dzięki za informację ~ Jako notatkę, jeśli rozwiązałeś swoje własne pytanie, podczas gdy nie możesz przyjąć natychmiast, ogólnie dobra forma akceptuje twoją własną odpowiedź, tak, jeśli ludzie szukają, to pokazuje, że jest akceptowalna odpowiedź. - Rixius
Czy można to zrobić? -ToOne stowarzyszenia (klucze zagraniczne)? - Dimitry K
Wiem, że to stary post, ale @Dimitry K jest to możliwe. Wystarczy, że użyjesz nazwy kolumny, jak w twoim @ORM \ JoinColumn (name = "join_table_id", referencedColumnName = "id", nullable = false). Oto "join_table_id". - herr
Pamiętaj, że musisz podać kolumna nazwy, a nie nazwy pól. Musisz więc przekonwertować camelCase na snake_case i dołączyć _id dla skojarzeń, ponieważ w ten sposób Doctrine generuje nazwy kolumn. - gronostaj
Jak rozwiązać ten sam problem za pomocą YAML? - FortuneSoldier


Dla mnie jest to bardziej gadatliwe use tylko ORM, a następnie prefiks ORM w adnotacjach. Pamiętaj też, że możesz przerwać adnotację do kilku wierszy, aby była bardziej czytelna, zwłaszcza jeśli masz kilka rzeczy do wymienienia (indeks w poniższym przykładzie).

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

16
2017-11-12 10:14





Wiem, że to stare pytanie, ale natknąłem się na to, szukając sposobu na stworzenie złożonego PK i pomyślałem, że może użyć jakiejś aktualizacji.

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

Tak więc oryginalny przykład może 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 tutaj:

  1. Kolumna "name" została pominięta, ponieważ Doctrine jest w stanie ją odgadnąć na podstawie nazwa nieruchomości
  2. Od videoDimension i videoBitrate są obie części PK - nie ma potrzeby precyzowania nullable = false
  3. Jeśli jest to wymagane - Kompozytowa PK może składać się z kluczy obcych, więc możesz dodać kilka mapowań relacyjnych

1
2018-06-08 18:37



To, co zrobiłeś, to złożony klucz podstawowy. Pewnie, że będzie wyjątkowy, ale jest to klucz podstawowy ...;) - Preciel
Cóż, tak, myślę, że wspomniałem o tym w mojej odpowiedzi :) Właściwie termin "unikatowy indeks" byłby bardziej odpowiedni w przypadku OP, gdyby nie chciał stworzyć PK (tak brzmi przyjęta odpowiedź). Ale ponieważ pytanie zawiera dziwny termin "złożony klucz unikalny" - nie widzę powodu, dla którego nie możemy założyć, że jest to złożony klucz podstawowy - przynajmniej tego właśnie szukałem, gdy natknąłem się na to pytanie. Twoje zdrowie! - Stas Parshin