2010-07-25 4 views
9

공식 문서와 수많은 스레드를 읽었지만 여전히 내 상황에 대한 해결책을 찾지 못했습니다. 내 경우는 매우 기본입니다. 두 엔티티가 있습니다. 주석과 키워드가 있습니다. 하나의 설명은 많은 키워드를 가질 수 있지만 각 키워드는 하나의 주석만을위한 것입니다. 키워드는 키워드 표에서 고유하지 않습니다. 그래서 저는 이것이 일대 다 (one-to-many) 관계라고 결정했습니다. 테이블 구조를 단순히 좋아은 다음과 같습니다교리에 문제 매핑 관계 매핑 2

키워드

id   int(11) 
comment_id int(11) 
text  varchar(30) 

의견 여기

id  int(11) 
text text 

내가 그들을 매핑하는 방법입니다

158,343,210 어떻게이처럼 사용 :


$comments = $this->em->getRepository('comments')->findAll(); 
foreach($comments as $comment){ 
    foreach($comment->getKeywords() as $keyword){ 
     $keyword->getText(); 
    } 
}

이 오류를 가지고 :

 
Notice: Undefined index: comment_id in C:\web_includes\doctrine\ORM\Persisters\BasicEntityPersister.php on line 1096 
Notice: Trying to get property of non-object in C:\web_includes\doctrine\ORM\Persisters\BasicEntityPersister.php on line 1098 
Warning: Invalid argument supplied for foreach() in C:\web_includes\doctrine\ORM\Persisters\BasicEntityPersister.php on line 1098 
Notice: Undefined index: comment_id in C:\web_includes\doctrine\ORM\PersistentCollection.php on line 168 
Fatal error: Call to a member function setValue() on a non-object in C:\web_includes\doctrine\ORM\PersistentCollection.php on line 169 
잘못 무엇입니까? comment_id는 어디에 정의해야합니까? 내 매핑이 맞습니까? 나는 정말로 붙어서 도움이 필요하다. 어떤 충고도 환영한다.

+0

어떤'comment_id'에 대해 어떻게 역/소유 작품에 문서를 참조하십시오? 어떻게하면 코멘트와 키워드의 관계를 설정합니까? – Sadat

+0

comment_id는이 키워드가 속한 설명의 ID가있는 키워드 테이블의 데이터베이스 필드입니다. 나는 doctrine이 주석을위한 키워드를 선택할 때 그것을 사용할 것이라고 생각한다. 관계가 다음과 같습니다. OneToMany (targetEntity = "keywords", mappedBy = "comment_id") 맞습니까? – SET

답변

13

mappedBy 속성은 외래 키의 이름에 대해 아무 것도 말하지 않습니다. "@JoinColumn"주석이 대상입니다. 이 시나리오에 대한 올바른 매핑은 다음과 같습니다 당신이이

  1. : 당신의 매핑에

    CREATE TABLE comments (id INT NOT NULL, text LONGTEXT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
    CREATE TABLE keywords (id INT NOT NULL, comment_id INT DEFAULT NULL, text LONGTEXT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
    ALTER TABLE keywords ADD FOREIGN KEY (comment_id) REFERENCES comments(id); 
    

    두 가지 문제 : 스키마 도구를 사용하여

    /** 
    * @Entity 
    * @Table(name="comments") 
    **/ 
    class Comments 
    { 
        /** @Id @Column(type="integer") */ 
        private $id; 
        /** @Column(type="text") */ 
        private $text; 
    
        /** 
        * @OneToMany(targetEntity="keywords", mappedBy="comment") 
        */ 
        private $keywords; 
    
        public function getText(){return $this->text;} 
        public function getId(){return $this->id;} 
        public function getKeywords(){return $this->keywords;} 
    } 
    
    /** 
    * @Entity 
    * @Table(name="keywords") 
    */ 
    class Keywords 
    { 
        /** @Id @Column(type="integer") */ 
        private $id; 
    
        /** 
        * @ManyToOne(targetEntity="Comments", inversedBy="keywords") 
        */ 
        private $comment; 
    
        /** 
        * @Column(type="text") */ 
        private $text; 
    
        public function getText(){return $this->text;} 
        public function getId(){return $this->id;} 
    } 
    

    은 당신의 스키마와 동일한 SQL을 생성 소유와 반대면의 차이점을 이해하십시오. 일대 다 단방향 관계 만 있으면 세 번째 조인 테이블이 필요합니다. 그러나 소유 측면 속성 Keyword :: $ comment와의 매핑 에서처럼 양방향 관계로 작동합니다.

  2. "mappedBy"는 다른 targetEntity의 "this associations의 다른 쪽"인 속성을 참조합니다. InversedBy는 다소 동일한 의미를 가지며, 단지 inversedBy가 항상 소유 측면에서 지정됩니다. 반대로 inverseBy는 mappedBy입니다.

이 모든 것은 매우 복잡한 것처럼 들리지만 필수적인 SQL UPDATE 문 수가 가장 적은 연결을 업데이트 할 수 있으므로 ORM 기술 관점에서 보면 매우 효율적입니다.

http://www.doctrine-project.org/projects/orm/2.0/docs/reference/association-mapping/en#owning-side-and-inverse-side

+0

정말 실용적입니다! 고맙습니다. 그러나 나는 단방향 관계와 양방향의 차이점은 무엇인지 물어야합니다.또한, 내 경우에 어떤 엔티티가 반대면과 무엇을 소유하게 될 것입니다. 나는 소유주와 keywodrs에있는 주석이 역이라고 생각하지만, 그 이유를 말할 수는 없다. – SET

+0

외부 키 "comment_id"가 키워드 테이블에 있기 때문에 키워드가 소유 측면입니다. 단방향이란 Comment :: getKeywords()를 사용하여 메모에서 키워드로만 이동할 수 있음을 의미합니다. 양방향이란 추가 Keyword :: getComment()를 사용하여 양방향으로 이동할 수 있다는 것을 의미합니다 (예제에서는 누락 됨). 연결 장은 다소 길지만 전체 개념을 얻으려면 "연관을 사용한 작업"및 "연결 매핑"장을 모두 읽어야합니다. – beberlei