2014-12-09 4 views
0

"Groups"와 "Checks"사이의 양방향 다 대다 관계가 있습니다.Doctrine 양방향 many to many

데이터베이스 테이블 :

+--------------------+ 
| GROUP    | 
+--------------------+ 
| id    | 
| name    | 
| next    | 
+--------------------+ 

+--------------------+ 
| CHECKFOR   | 
+--------------------+ 
| group    | 
| check    | 
+--------------------+ 

+--------------------+ 
| CHECK    | 
+--------------------+ 
| id    | 
| description  | 
| author   | 
+--------------------+ 

심포니의 교리 엔티티

그룹

<?php 
class Group implements GroupInterface 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * @ORM\Column(name="name", type="string", length=32, nullable=false) 
    */ 
    private $name; 

    /** 
    * @ORM\OneToOne(targetEntity="Group") 
    * @ORM\JoinColumn(name="next", referencedColumnName="id") 
    * @Serializer\Exclude 
    */ 
    private $next; 

    /** 
    * @ORM\OneToMany(targetEntity="CheckFor", mappedBy="group") 
    */ 
    private $checks; 

    ... 

} 

확인

0 실행시
<?php 
class Check implements CheckInterface 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * @ORM\Column(name="description", type="string", length=256) 
    */ 
    private $description; 

    /** 
    * @ORM\ManyToOne(targetEntity="\Jds\UserBundle\Entity\User") 
    * @ORM\JoinColumn(name="madeByUser", referencedColumnName="id") 
    * @Serializer\Exclude 
    */ 
    private $author; 

    /** 
    * @var string 
    * @ORM\Column(name="kind", type="string", length=20) 
    */ 
    private $kind; 

    /** 
    * @ORM\OneToMany(targetEntity="CheckFor", mappedBy="group") 
    */ 
    private $groups; 

} 

checkfor는

class CheckFor implements CheckForInterface 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Check") 
    * @ORM\JoinColumn(name="check", referencedColumnName="id") 
    * @ORM\Id 
    */ 
    private $check; 

    /** 
    * @ORM\ManyToOne(targetEntity="Group") 
    * @ORM\JoinColumn(name="group", referencedColumnName="id") 
    * @ORM\Id 
    */ 
    private $group; 

    ... 
} 

무한 루프 ..->repository->findBy()에 의해 생성된다. 이 '버그'를 방지하는 방법은 무엇입니까?

로그 :

[2014-12-09 14:04:23] doctrine.DEBUG: SELECT t0.id AS id1, t0.name AS name2, t0.next AS next3 FROM the_group t0 [] [] 
[2014-12-09 14:04:23] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [1] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["1"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [1] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["2"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [2] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["3"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [3] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["4"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [4] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["5"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [5] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["7"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [7] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["15"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [15] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["10"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [10] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["14"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [14] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["19"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [19] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["25"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [25] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.id AS id1, t0.title AS title2, t0.description AS description3, t0.kind AS kind4, t0.madeByUser AS madeByUser5 FROM the_check t0 WHERE t0.id = ? ["26"] [] 
[2014-12-09 14:04:24] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [26] [] 
[2014-12-09 14:05:01] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [2] [] 
[2014-12-09 14:05:21] doctrine.DEBUG: SELECT t0.check AS check1, t0.group AS group2 FROM checkfor t0 WHERE t0.group = ? [3] [] 

UPDATE 3 : 나는 문제를 발견했다! 'Checks'는 persistentcollection이지 배열 콜렉션이 아닙니다. persistentcollection이 JMS serializer에서 제대로 작동하지 않습니다. 그룹 개체의 덤프를 인쇄 할 때 dev_log (= correct)에서 2 개의 쿼리를 볼 수 있습니다. serializer를 사용하여 객체를 구문 분석 할 때 +10 개의 쿼리 (= 좋지 않음)가 표시됩니다.

해결책을 찾고 난 후 lazyloading을 사용하지 못하도록 시도했지만 문제가 해결되지 않았습니다.

+0

하면 해당 페이지 하나 하나에 모범을 따르려고 노력 적이있다? joincolumns 제거, 그냥 조인 테이블을 추가하고 이름을 지정하십시오. 또한 생성자를 가져야합니다. – Koalabaerchen

+0

같은 문제가 있습니다. 어떻게 컬럼 이름을 기본값 : "entity_id"와 다른 것으로 설정할 수 있습니까? 이 테스트를 위해 컬럼 이름을 바꿀 수 있습니다. – jsprds

답변

0

Doctrine ManyToMany가 실제로 존재하므로 세 번째 엔티티를 만들 필요가 없습니다. 자동으로 생성됩니다. 이것에 대한

키워드 @ORM \ 관절 식

http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#many-to-many-bidirectional

+0

같은 문제 : /** * @ORM \ ManyToMany (targetEntity = "그룹", inversedBy는 = "확인") * @ORM \ 관절 식 (이름 = "checkfor" * joinColumns = {@ ORM \ JoinColumn (이름 = "그룹", referencedColumnName = "id")}, * inverseJoinColumns = {@ ORM \ JoinColumn (이름 = "확인", referencedColumnName = "id", unique = true)} *) **/ 개인 $ 그룹; /** * @ORM \ ManyToMany (targetEntity = mappedBy는 = "그룹", "확인") * @ORM \ JoinColumn (이름 = "검사", referencedColumnName로는 = "그룹") **/ 개인 $ 체크 무늬; – jsprds

+0

질문을 업데이트 할 수 있습니까? 읽기가 쉽습니다. – Koalabaerchen

+0

죄송합니다. 내 게시물을 업데이트했습니다. – jsprds