2016-08-19 7 views
1

업데이트 01.09.2016 내 프로젝트를 업데이트했습니다. 이제 내 엔티티에서 사용자 정의 JoinColumn을 제거했습니다. 이제는 하나가 생성되고 프로젝트는 w/o 오류없이 작동합니다. 좋은 생각 심포니 2.7, 교리 2.7 ManyToOne 단방향 관련 JoinColumn을 사용자 정의라는 이름의 사용하도록사용자 정의 JoinColumn 이름을 사용한 Doctrine의 ManyToOne ORM 연관

인가 : 그리고 질문을 단축 하기로 결정?

내 경우였다


많은ipGroup 엔티티 (많은 IP 주소를 유지) ipGroupPrameters 엔티티과 연관되어야한다.

1) : 나는 3 개 변종 ('워크 플로우'참조)에서 코드를 실행하려고, 다른 오류를 받고 있어요


(아래 코드 참조). 오류, ipGroupParams를 작성 DB 테이블 및 는 ipGroup에게 테이블을 임의의 행를 삽입하지;

2). "주의 : 정의되지 않은 인덱스 : ipGroupId"라인 685

$value = $newValId[$targetClass->fieldNames[$targetColumn]]; 

에서 공급 업체/교리/ORM/lib 디렉토리/교리/ORM/영속/BasicEntityPersister.php 정말 이상하다 - $ targetClass를 ipGroupId에있다 fieldNames (디버거가 보여주는 것처럼);

3). (이 변형에서는 소유 관계로 변경됨) DBAL 예외 : 'INERT INTO ipGroup (ipGroupId, ip) VALUES (?,?)'를 params [null, "134.17. 26.129 "] ipGroupId는 null 일 수 없습니다. $ gObj에 setIpGroupId 메서드를 적용하고 이것이 RAM에서 업데이트되기 때문에 이것은 마술입니다 (디버거에서 볼 수 있습니다).

워크 플로우은 다음과 같습니다

public function createIpGroup() 
{ 
    $this->createParamsObj(); 
    $gObj = new \Bmw\StatBundle\Entity\ipGroup(); 
    $gObj->setIpGroupId($this->groupId); 
    $gObj->setIp($ip); 
    ### 1 variant 
    $gObj->setIpGroupParams($this->paramsObj); 
    ### 2 variant 
    $gObj->setIpGroupParams($this->paramsObj); 
    $this->em->persist($gObj); // if not rely on cascade persist 
    ### 3 variant 
    $this->paramsObj->addIpGroup($gObj); 
    $this->em->persist($this->paramsObj); 
    ### 
    $this->em->flush(); 
} 
public function createParamsObj() 
{ 
    $pObj = new \Bmw\StatBundle\Entity\ipGroupParams(); 
    $this->groupId = $this->container->get('my.id.generator')->generate(); 
    $pObj->setIpGroupId($this->groupId); 
    $this->em->persist($pObj); 
    $this->em->flush(); 
    $this->paramsObj = $pObj; 
} 
다음

기관 코드 초기입니다 - 그럼 내가 문서를 실행 세대 :

/** 
* ipGroup 
* 
* @ORM\Table(
* uniqueConstraints={ 
* @UniqueConstraint(name="ip", columns={"ip"}), 
* @UniqueConstraint(name="userId", columns={"userId"}), 
* }, 
* indexes={@Index(name="ipGroupId", columns={"ipGroupId"})}, 
*) 
* @ORM\Entity 
*/ 
class ipGroup 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ipGroupId", type="integer") 
    */ 
    private $ipGroupId; 

    /** 
    * @ORM\ManyToOne(targetEntity="ipGroupParams", inversedBy="ipGroup") 
    * @ORM\JoinColumn(name="ipGroupId", referencedColumnName="ipGroupId") 
    */ 
    private $ipGroupParams; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="ip", type="string", length=45, nullable=true) 
    */ 
    private $ip; 
} 
: 엔티티
가 자동으로 getter 및 setter를 만들
/** 
* ipGroupParams 
* 
* @ORM\Table(
* uniqueConstraints={ 
* @UniqueConstraint(name="ipGroupId", columns={"ipGroupId"}), 
* } 
*) 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks() 
*/ 
class ipGroupParams 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @ORM\OneToMany(targetEntity="ipGroup", mappedBy="ipGroupParams", cascade={"persist", "remove"}, orphanRemoval=TRUE) 
    */ 
    private $ipGroup; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ipGroupId", type="integer") 
    */ 
    private $ipGroupId; 
} 
+0

멍청한 질문 : 엔티티 setter 및 getter 생성 한 적이 있습니까? –

+0

예, @GeraldChablowski, getters/setters 생성 코드는 [link] (https://docs.google.com/document/d/1c1V34ekmPbYfDGNAFfRgNVb8Tpvalmo3_dwpNO67NDI/edit?usp=sharing) – Parks

답변

0

Doctrine은 두 개체를 자동으로 연결하지 않지만 이 지속되어 같은 시간에 저장하지 않습니다..그게 작동해야합니다 :

public function createIpGroup() 
{ 
    $this->createParamsObj(); 
    $gObj = new \Bmw\StatBundle\Entity\ipGroup(); 
    $gObj->setIpGroupId($this->groupId); 
    $gObj->setIp($ip); 
    $gObj->setIpGroupParams($this->paramsObj); 

    $this->paramsObj->addIpGroup($gObj); 

    $this->em->persist($gObj); 
    $this->em->flush(); 
} 
+0

을 참조하십시오. 감사하지만 작동하지 않습니다. ** variant2 **. 또한, 그 지속은 @OneToMany (..., cascade = { "persist", "remove"}, ...) 표기법에 의해 자동으로 발생합니다. ip2Params 엔티티에서 ... – Parks

+0

나는 그것을 편집하고 $ gObj를 추가했습니다. -> setIpGroupId ($ this-> groupId) ;. 지금 일해야한다. –

+0

죄송합니다, @GeraldChablowski,하지만 당신은 어떤 라인을 추가하지 않았다, 당신은 방금 2와 3의 변종을 결합했습니다 – Parks