Các phím duy nhất của giáo lý và tổng hợp


96

Tôi muốn làm chìa khóa duy nhất tổng hợp trong học thuyết. Đó là những lĩnh vực của tôi:

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

Làm thế nào tôi có thể chỉ ra học thuyết, rằng những học thuyết kết hợp với nhau là chìa khóa duy nhất tổng hợp?

Câu trả lời:


216

Trả lời câu hỏi:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

Xem @UniqueConstraint


3
Cảm ơn bạn đã cung cấp thông tin ~ Xin lưu ý, nếu bạn đã giải quyết được câu hỏi của chính mình, trong khi bạn không thể chấp nhận ngay lập tức, thì thông thường, bạn nên chấp nhận câu trả lời của chính mình, vì vậy nếu mọi người đang tìm kiếm, nó cho thấy có một câu trả lời có thể chấp nhận được.
Rixius

2
Có thể làm điều đó với các -ToOneliên kết (khóa ngoại) không?
Dimitry K

5
Tôi biết đây là bài viết cũ, nhưng @Dimitry K thì có thể. Bạn chỉ cần sử dụng tên cột như trong @ORM \ JoinColumn (name = "join_table_id", referenceColumnName = "id", nullable = false). Đây là 'join_table_id'.
herr

Lưu ý rằng bạn phải cung cấp tên cột , không phải tên trường. Vì vậy, bạn phải chuyển đổi camelCase thành solid_case và nối thêm _idcác liên kết, vì đó là cách Doctrine tạo ra các tên cột.
gronostaj

tên được tự động tạo @Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})và không có gì khác quan trọng
Vasilii Suricov

18

Tôi thấy nó dài dòng hơn khi usechỉ ORM và sau đó là tiền tố ORMtrong chú thích. Cũng lưu ý rằng bạn có thể ngắt chú thích thành nhiều dòng để làm cho nó dễ đọc hơn, đặc biệt nếu bạn có một số mục cần đề cập (chỉ mục trong ví dụ bên dưới).

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

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã gặp nó khi đang tìm cách tạo PK tổng hợp và nghĩ rằng nó có thể sử dụng một số cập nhật.

Mọi thứ thực sự đơn giản hơn nhiều nếu thứ bạn cần là một Khóa chính tổng hợp. (Trong đó, dĩ nhiên, đảm bảo tính độc đáo) tài liệu thuyết chứa một số mẫu đẹp bởi url này: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

Vì vậy, ví dụ ban đầu có thể trông giống như sau:

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

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

Một vài lưu ý ở đây:

  1. Cột "tên" bị bỏ qua vì Doctrine có thể đoán nó dựa trên tên thuộc tính
  2. videoDimensionvideoBitratelà cả hai phần của PK - không cần chỉ địnhnullable = false
  3. Nếu được yêu cầu - PK tổng hợp có thể bao gồm các khóa ngoại, vì vậy hãy thoải mái thêm một số ánh xạ quan hệ

Những gì bạn đã làm là một khóa chính tổng hợp. Chắc chắn nó sẽ là duy nhất, nhưng đó là khóa chính ...;)
Preciel

À vâng, tôi nghĩ tôi đã đề cập đến điều đó trong câu trả lời của mình :) Thực ra thuật ngữ "chỉ số duy nhất" sẽ phù hợp hơn trong trường hợp của OP nếu anh ấy không có ý định tạo PK (đó là câu trả lời được chấp nhận). Nhưng vì câu hỏi chứa một thuật ngữ kỳ lạ "khóa duy nhất tổng hợp" - tôi không hiểu tại sao chúng ta không thể cho rằng nó là khóa chính tổng hợp - ít nhất đó là những gì tôi đã tìm kiếm khi bắt gặp câu hỏi này. Chúc mừng!
Stas Parshyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.