2017-10-17 29 views
0

Zend\Form 데이터에서 자동 수화로 생성 된 복잡한/중첩 된 객체가 있습니다. 이제 Doctrine 2로 저장하고 싶습니다. 가장 좋은 경우는 persist(...)이고 하나는 flush(...)입니다. 하지만 이런 식으로 작동하지 않습니다. 그래서 지금 다음과 같은 문제가 있습니다 :엔티티가 존재하지 않는 경우에만 관계의 한쪽 끝과 다른 쪽 끝을 유지하는 방법은 무엇입니까?

UserOrder이 있습니다. 그 관계는 1:n입니다 (그래서 1UsernOrders입니다). User이 이미 있습니다. UserJoe 시도가 하나 이상의 Order (예 : 두 번째 순서)를 저장할 때 오류가 발생합니다

새로운 개체가 구성되지 않은 관계 '... \ 주문 번호 사용자'를 통해 발견 된 엔티티에 대한 계단식 지속 작업 : ... \ User @ 000000003ba4559d000000005be8d831. 이 문제를 해결하려면 : 알 수없는 엔티티에서 EntityManager # persist()를 명시 적으로 호출하거나 캐스케이드를 구성하여 매핑에서이 연결을 @ManyToOne (.., cascade = { "persist"})과 같이 유지합니다. 어떤 엔티티가 문제를 일으키는 지 알 수 없다면 '... \ User #__ toString()'을 구현하여 힌트를 얻으십시오. (어쨌든 여기 이해하지 않지만,하지만 단지 그것을 밖으로 시도)

알려줘야, 나는 cascade={"persist"} 추가

class Order 
{ 
    ... 
    /** 
    * @var User 
    * 
    * @ORM\ManyToOne(targetEntity="User", cascade={"persist"}) 
    */ 
    protected $user; 
    ... 
} 

존재하지 않는 User 주어진다면 지금은, 작동 : OrderUser이 생성됩니다.

그러나 User이 존재하는 경우, 오류가 발생

는 :으로 '(??,) 사용자 삽입 반 (이름, 역할 작성된 업데이트) 값을'실행 중에

예외가 발생 PARAMS [ "MyUserName 에다", "멤버", NULL, NULL] :

SQLSTATE [23000] : 무결성 제약 조건 위반 : 키 1062 중복 항목 'MyUserName 에다'username_UNIQUE '를 처리하는 방법

사비 따라서 아직 존재하지 않는다면 User 만 저장됩니다.

+0

당신이 심포니 양식 (또는 유일한 검증 구성 요소)이 객체의 유효성을 검사입니까? [UniqueEntity Constraints] (https : // symfony.com/doc/current/reference/constraints/UniqueEntity.html) – Matteo

+0

의견을 보내 주셔서 감사합니다.하지만 Symfony가 아니라'Zend \ Form'을 사용하고 있습니다. 유효성을 검사하는 양식의 경우 Zend 유효성 검사 기능을 사용합니다. – automatix

+0

Doctrine 오류가 발생할 때마다 "엔티티에 대한 지속 작업을 계단식으로 구성하지 않은 '... \ Order # user'관계를 통해 새 엔티티가 발견되었습니다."내가 뭔가 잘못했거나 보통 작은. 영어로 주문이 지속되었지만 관련 사용자가 유지되지 않았다는 오류가 표시됩니다. 즉, 할당 된 사용자는 데이터베이스에있는 개체로 교리에 알려져 있지 않습니다. 코드를주의 깊게 확인하고 실제로 적절한 사용자를 할당하고 유효 한 사용자인지 확인하십시오. – MEmerson

답변

0

해결 방법은 참조 엔터티를 저장하기 전에 User을 유지하는 것입니다. 아직 존재하지 않는 경우, 먼저 (persist 에드와 flush ED)를 작성해야합니다 : 실제로이 경우에는 이해가되지 않기 때문에

$user = $this->entityManager->getRepository(User::class)->findOneBy(
    ['username' => $dataObject->getUser()->getUsername()] 
); 
if (! $user) { 
    $this->entityManager->persist($dataObject->getUser()); 
    $this->entityManager->flush($dataObject->getUser()); 
    $user = $this->entityManager->getRepository(User::class)->findOneBy(
     ['username' => $dataObject->getUser()->getUsername()] 
    ); 
} 
$dataObject->setUser($user); 

$this->entityManager->persist($dataObject); 
$this->entityManager->flush(); 

그리고 cascade={"persist"}는 사용할 수 없습니다.


편집

심지어 쉽게 :

$user = $this->entityManager->getRepository(User::class)->findOneBy(
    ['username' => $dataObject->getUser()->getUsername()] 
); 
if ($user) { 
    $dataObject->setUser($user); 
} else { 
    $this->entityManager->persist($dataObject->getUser()); 
} 

$this->entityManager->persist($dataObject); 
$this->entityManager->flush();