2009-07-15 2 views
22

INSERT OR UPDATE IF EXISTS 한 번에 처리하려고합니다.Doctrine ORM에 "update if exists"를 구현합니다

MySQL의에, 나는 일반적으로 DUPLICATE KEY ("DUPLICATE KEY ON UPDATE를".) 사용하는 것이 내가 여러 SQL 변형 및 하위 쿼리를 사용하여이 문제에 대한 많은 솔루션 알고 있어요,하지만 난이를 구현하기 위해 노력하고있어 Doctrine에서 (PHP ORM). 그것은 기능이 담겨 있기 때문에 Doctrine 메소드가있을 것 같지만 아무것도 찾지 못했습니다. 어떤 이유로 PHP ORM 패키지를 사용하는 것이 이런 종류의 문제입니까? 아니면 어떤 교리 전문가가 해킹이나 다른 방법을 통해 이것을 달성하는 방법을 알고 있습니까?

+0

이 기능을 구현하기 위해 플러그인 작업을 시작했습니다. 아직 초기 단계에 있지만 사용 사례를 테스트하고 작동합니다. https://github.com/m14t/m14tDoctrineRecordPlugin에서 사용할 수 있습니다. 테스트 케이스, 버그 리포트 및 요청을 환영합니다. – m14t

+0

나는 해결책으로 @ pix0r의 답을 표시해야한다고 생각한다. – Mojtaba

답변

2

Doctrine은 replace() 메서드를 사용하여 REPLACE INTO을 지원합니다. 이것은 당신이 찾고 있던 ON DUPLICATE KEY UPDATE과 똑같이 작동합니다.

문서 : 내가 생각할 수있는 Replacing Records

+9

REPLACE의 유일한 문제점은 drop과 자동 행 증분을 없애고 (실제 UPDATE를 수행하는 대신) 새로운 행을 생성하는 것 같다. 케이스, 내 기본 ID). 내가 여기서 뭔가를 놓치고 있니? 예 - 내 자동 증분 ID는 9이지만 개수는 3000입니다. 행 9에 대해 REPLACE INTO를 수행하면 새 행 ID는 3001입니다. – seans

+0

해결책이 아니므로 바꾸기가 자동으로 삭제/삽입되고 자동 변환됩니다 값 (ex id) – Exos

+0

링크가 깨졌습니다. –

5

있는 유일한 방법은, 그렇지 않으면 새로운 개체를 만들 수있는 경우 엔티티 먼저 쿼리하는 것입니다.

if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/)) 
{ 
    $entity = new Foo(); 
} 
/*do logic here*/ 
$entity->save(); 
+13

쿼리와 저장 사이에 행이 생성되지 않도록하는 방법은 없습니다. –

+5

그게 무슨 거래 아닌가요? – chiborg

+1

@IliaJerebtsov가 말한 것처럼 아주 위험합니다. 지속과 플러시 사이에 행을 만들 수 있습니다. 이 경우에는 순수 SQL ;-( –

관련 문제