교리 및 복합 고유 키


96

교리에서 복합 고유 키를하고 싶습니다. 그게 내 분야입니다.

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

함께 결합 된 것이 복합 고유 키라는 교리를 어떻게 보여줄 수 있습니까?

답변:


217

질문에 답하세요:

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 2013 년

2
그것은 함께 할 수 있나요 -ToOne협회 (외래 키)?
Dimitry K 2014 년

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 2019 년

18

useORM에만 더 장황한 다음 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를 만드는 방법을 찾는 동안 발견했으며 약간의 업데이트를 사용할 수 있다고 생각했습니다.

필요한 것이 복합 기본 키인 경우 실제로 훨씬 간단합니다. (물론 고유성을 보장하는) Doctrine 문서에는 다음 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. Doctrine은 속성 이름을 기준으로 추측 할 수 있으므로 "name"열은 생략됩니다.
  2. 이후 videoDimensionvideoBitrate약동학의 두 부분이 있습니다 - 지정할 필요가 없습니다nullable = false
  3. 필요한 경우-Composite PK는 외래 키로 구성 될 수 있으므로 관계형 매핑을 자유롭게 추가 할 수 있습니다.

당신이 한 일은 복합 기본 키입니다. 물론 고유하지만 기본 키입니다 ...;)
Preciel

글쎄, 나는 내 대답에서 언급했다고 생각한다 :) 실제로 그가 PK를 만들려고하지 않았다면 OP의 경우 "고유 색인"이라는 용어가 더 적절할 것입니다 (그것이 수락 된 대답이하는 것입니다). 그러나 질문에 "복합 고유 키"라는 이상한 용어가 포함되어 있기 때문에 복합 기본 키라고 가정 할 수없는 이유를 알 수 없습니다. 적어도이 질문을 접했을 때 제가 찾고 있던 것입니다. 건배!
Stas Parshyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.