2012-12-17 2 views
16

Doctrine-Entity에서 사람이 읽을 수있는 ID를 구현하고 싶습니다. DB-ID를 유지하고 "PRE12-00005"(접두사와 연도, 새해 0시에 시작)와 같은 것을 추가하려고합니다. Custom-ID-Generator를 추가하려고 시도했지만 Doctrine이 하나의 Entity에서 두 개의 생성 된 Values를 사용할 수없는 것으로 보입니다.Doctrine에서 두 개의 생성 된 값

/** 
* @var integer 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
protected $id; 

/** 
* @var string 
* @ORM\Column(name="name", type="string", length=25, unique=true) 
* @ORM\GeneratedValue(strategy="CUSTOM") 
* @ORM\CustomIdGenerator(class="NameGenerator") 
*/ 
protected $name; 

교리는 항상 "이름"에 "ID"-Field 및 널 (null)로 내 발전기의 반환 값을 저장하려고합니다. 그것을 구현할 다른 방법이 있습니까?

답변

18

GeneratedValue 전략은 기본 키에 대해 예약되어 있으므로 Entity 당 한 번만 사용할 수 있습니다.

필요에 따라하지만 몇 가지 옵션이 있습니다

  • 당신은 항상 당신이 그것을 처음을 지속하기 전에 이름을 원하는 값을 설정하는 prePersist lifecycle event을 가질 수 있습니다. 당신이 그것을에서 다른 고유 ID를 생성하기 위해 ID에 의존하는 경우

  • , 당신이 당신의 이름을 설정하는 postPersist 이벤트를 구현하고 기본 키, 두 번째 시간을 생성하기 위해 두 번 (처음 플러시 확인 할 수 이름을 저장하십시오).

  • 잠시 동안 데이터베이스에서 이름이 비어있는 경우 이름이 비어있는 경우 postLoad 이벤트를 구현하는 것이 좋습니다. 이렇게하면 응용 프로그램에 항상 이름이 표시됩니다 (데이터베이스에서로드되거나 postLoad 이벤트로 채워지기 때문에). 처음 저장 후 정보를 추가하거나 편집하면 이름도 저장됩니다.

  • It 이름을 저장하지 않고 일부 cronjob/deamon/queue에 의해 생성되도록 할 수 있으므로 응용 프로그램이이를 처리 할 필요가 없습니다. 당신이해야 할 유일한 일은 누락 된 이름이 어떤 것을 망치지 않는지 확인하는 것입니다.

  • 기본 키에 의존하지 않는 키를 생성하는 것이 좋을 수도 있으므로 global event handler으로 생성 할 수 있습니다. 당연히 그와 같은 이벤트 핸들러는 그가 글로벌이기 때문에 그것이 올바른 엔티티인지에 상관없이 당신이 유지하는 모든 오브젝트에 대해 호출된다는 단점이 있습니다.

  • 마지막으로 저장 프로 시저/트리거로 폴백하여 데이터베이스에서 처리하도록 할 수도 있습니다. 이렇게하면 응용 프로그램 내부에서이 문제를 해결할 필요가 없습니다. 그러나주의 할 점은 함정에 빠질 수도 있습니다 (코드에 없기 때문에 개발자가 잊어 버린 것처럼 데이터베이스에!).

다른 방법이있을 수 있습니다. 내가 말하고자하는 것은 : 비 기본 키 속성에 generatedValue를 사용하지 마십시오!

+0

이벤트에서 EM을 사용하는 권장 방법이 있습니까? 나는 매뉴얼에서 그것에 대해 아무 것도 발견하지 못했지만 어쩌면 문제는 내 머리 속에 만 존재합니다 :-) ... 나는 다른 방법에 대해 생각합니다 : 숫자 ID를 제거하십시오 ... 가능한 실용적이거나 다른 것 문제가 있습니까? – icksde

+0

일반적인 문제가 없기 때문에 권장 방법이 없다고 생각합니다. 이것은 고도로 도메인 특정 및 위에서 본 바와 같이, 여러 가지 솔루션이 있습니다 - 일부는 특정 문제에 더 좋고 그렇지 않은 것도 있습니다. 숫자 ID에 관해서 : 문제 자체로 실행되지는 않지만 varchar 키를 많이 사용하면 데이터베이스 성능이 저하 될 수 있습니다. – Sgoettschkes

+0

링크가 작동하지 않습니다. 다시 연결하거나 다른 것을 시도하십시오 – Trix

관련 문제