Câu hỏi Các khóa duy nhất của giáo lý và tổng hợp


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ể hiển thị học thuyết, rằng những người kết hợp với nhau là chìa khóa duy nhất tổng hợp?


76
2017-09-28 14:11


gốc




Các câu trả lời:


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 @Hạn chế duy nhất


160
2017-09-29 07:57



Cảm ơn thông tin ~ Như một lưu ý, nếu bạn giải quyết câu hỏi của riêng mình, trong khi bạn không thể chấp nhận ngay lập tức, đó là hình thức tốt để chấp nhận câu trả lời của riêng bạn, chỉ vì vậy nếu mọi người đang tìm kiếm, nó cho thấy có câu trả lời chấp nhận được. - Rixius
Có thể làm điều đó với -ToOne liên kết (khóa ngoại)? - Dimitry K
Tôi biết đây là bài cũ, nhưng @Dimitry K nó là có thể. Chỉ cần bạn sử dụng tên cột như trong @ORM \ JoinColumn của bạn (name = "join_table_id", referencedColumnName = "id", nullable = false). Đây là 'join_table_id'. - herr
Lưu ý rằng bạn phải cung cấp cột tên, không phải tên trường. Vì vậy, bạn phải chuyển đổi camelCase thành snake_case và nối thêm _id cho các hiệp hội, bởi vì đó là cách Doctrine tạo ra các tên cột. - gronostaj
Làm thế nào để giải quyết vấn đề tương tự bằng cách sử dụng YAML? - FortuneSoldier


Tôi thấy nó tiết hơn use chỉ tiền tố ORM và sau đó ORM trong chú thích. Cũng lưu ý rằng bạn có thể phá vỡ chú thích thành nhiều dòng để làm cho nó dễ đọc hơn, đặc biệt là nếu bạn có vài 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={"nane"})
 * })
 */
class VideoSettings

16
2017-11-12 10:14





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

Những điều thực sự đơn giản hơn nhiều nếu những gì bạn cần là một khóa chính Composite. (Tất nhiên, nó đảm bảo tính duy nhất) Tài liệu Doctrine chứa một số ví dụ hay bằng 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 "name" bị bỏ qua vì Doctrine có thể đoán nó dựa trên tên thuộc tính
  2. videoDimension và videoBitrate là cả hai phần của PK - không cần phải chỉ định nullable = false
  3. Nếu được yêu cầu - PK hỗn hợp có thể bao gồm các khóa ngoại, do đó, vui lòng thêm một số ánh xạ quan hệ

1
2018-06-08 18:37



Những gì bạn đã làm là một khóa chính kết hợp. Chắc chắn nó sẽ là duy nhất, nhưng đó là một khóa chính ...;) - Preciel
Vâng, tôi nghĩ rằng tôi đã đề cập rằng trong câu trả lời của tôi :) Trên thực tế thuật ngữ "chỉ số duy nhất" sẽ phù hợp hơn trong trường hợp OP nếu anh ta 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 có chứa thuật ngữ kỳ lạ "khóa duy nhất tổng hợp" - tôi không thấy lý do tại sao chúng tôi không thể giả định nó là khóa chính kết hợp - ít nhất đó là những gì tôi đã tìm kiếm khi tôi gặp câu hỏi này. Chúc mừng! - Stas Parshin