คีย์เฉพาะหลักคำสอนและคอมโพสิต


105

ฉันต้องการสร้างคีย์เฉพาะในหลักคำสอน นี่คือฟิลด์ของฉัน:

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

ฉันจะแสดงหลักคำสอนได้อย่างไรว่าสิ่งเหล่านั้นรวมกันเป็นกุญแจเฉพาะแบบผสม

คำตอบ:


227

ตอบคำถาม:

use Doctrine\ORM\Mapping\UniqueConstraint;

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

ดู@UniqueConstraint


3
ขอบคุณสำหรับข้อมูล ~ โปรดทราบว่าหากคุณแก้ไขคำถามของคุณเองแล้วในขณะที่คุณไม่สามารถยอมรับได้ในทันทีโดยทั่วไปแล้วการยอมรับคำตอบของคุณเองก็เป็นรูปแบบที่ดีดังนั้นหากผู้คนกำลังค้นหาก็จะแสดงว่ามีคำตอบที่ยอมรับได้
Rixius

2
เป็นไปได้ไหมที่จะ-ToOneเชื่อมโยงกับการเชื่อมโยง (คีย์ต่างประเทศ)
Dimitry K

5
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ @Dimitry K เป็นไปได้ เพียงแค่คุณต้องใช้ชื่อคอลัมน์ใน @ORM \ JoinColumn ของคุณ (name = "join_table_id", referencedColumnName = "id", nullable = false) นี่คือ "join_table_id"
herr

โปรดทราบว่าคุณต้องระบุชื่อคอลัมน์ไม่ใช่ชื่อฟิลด์ ดังนั้นคุณต้องแปลง camelCase เป็น snake_case และต่อท้าย_idสำหรับการเชื่อมโยงเพราะนั่นคือวิธีที่ Doctrine สร้างชื่อคอลัมน์
gronostaj

ชื่อถูกสร้างขึ้นโดยอัตโนมัติ@Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})})และไม่มีอะไรสำคัญ
Vasilii Suricov

19

ฉันพบว่ามันละเอียดกว่าuseเฉพาะ ORM แล้วจึงนำหน้าORMในคำอธิบายประกอบ นอกจากนี้โปรดทราบว่าคุณสามารถแบ่งคำอธิบายประกอบเป็นหลายบรรทัดเพื่อให้อ่านได้ง่ายขึ้นโดยเฉพาะหากคุณมีหลายรายการที่จะกล่าวถึง (ดัชนีในตัวอย่างด้านล่าง)

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

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันเจอคำถามนี้ในขณะที่กำลังมองหาวิธีสร้าง PK แบบคอมโพสิตและคิดว่ามันสามารถใช้การอัปเดตได้

สิ่งต่างๆนั้นง่ายกว่ามากหากสิ่งที่คุณต้องการคือคีย์หลักแบบคอมโพสิต (ซึ่งแน่นอนรับประกันความเป็นเอกลักษณ์) เอกสารหลักคำสอนมีตัวอย่างที่ดีตาม URL นี้: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

ตัวอย่างต้นฉบับอาจมีลักษณะดังนี้:

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

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

หมายเหตุบางประการที่นี่:

  1. คอลัมน์ "ชื่อ" ถูกละไว้เนื่องจากหลักคำสอนสามารถเดาได้ตามชื่อคุณสมบัติ
  2. เนื่องจากvideoDimensionและvideoBitrateเป็นทั้งสองส่วนของ PK - ไม่จำเป็นต้องระบุnullable = false
  3. หากจำเป็น - Composite PK อาจประกอบด้วยคีย์ต่างประเทศดังนั้นอย่าลังเลที่จะเพิ่มการแมปเชิงสัมพันธ์

1
สิ่งที่คุณทำคือคีย์หลักแบบผสม แน่นอนว่ามันจะไม่ซ้ำกัน แต่เป็นคีย์หลัก ... ;)
Preciel

ใช่ฉันคิดว่าฉันได้พูดถึงสิ่งนั้นในคำตอบของฉัน :) จริงๆแล้วคำว่า "ดัชนีเฉพาะ" จะเหมาะสมกว่าในกรณีของ OP ถ้าเขาไม่ได้ตั้งใจที่จะสร้าง PK (นั่นคือคำตอบที่ยอมรับ) แต่เนื่องจากคำถามมีคำศัพท์แปลก ๆ "คีย์ผสมที่ไม่ซ้ำกัน" - ฉันไม่เห็นว่าทำไมเราจึงไม่สามารถถือว่ามันเป็นคีย์หลักแบบผสม - อย่างน้อยนั่นคือสิ่งที่ฉันกำลังมองหาเมื่อฉันเจอคำถามนี้ ไชโย!
Stas Parshyn

0

เวอร์ชัน XML:

<unique-constraints>
    <unique-constraint columns="column1,column2" name="give_some_explicit_name" />
</unique-constraints>

รายละเอียดเพิ่มเติมในเอกสาร:
https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/xml-mapping.html#defining-indexes-or-unique-constraints

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.