2014-12-09 62 views
0

我在“组”和“检查”之间具有双向多对多关系。主义双向多对多

数据库表:

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

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

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

Symfony的学说实体

集团

<?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; 

    ... 

} 

检查

<?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] [] 

更新3: 我已经找到了问题! '检查'是一个持久性收集,而不是一个数组收藏。 持久收集对于JMS序列化程序不起作用。当我打印组对象的转储时,我在dev_log(= correct)中看到2个查询。当我用序列化程序解析对象时,我看到+10个查询(=不好)。

我已经搜索了一个解决方案,并试图禁用lazyloading但这并没有解决问题。

+0

您是否尝试过按照页面一个接一个的例子吗?摆脱联接列,只需添加联接表并为其命名即可。另外一定要有构造函数 – Koalabaerchen 2014-12-09 14:41:07

+0

同样的问题,以及如何设置列名不同于默认值:“entity_id”。我已经改变了我的测试列名。 – jsprds 2014-12-09 14:51:50

回答

0

ManyToMany主义实际存在,所以你不需要创建第三个实体。它会自动创建。

关键字这是@ORM \ JoinTable

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

+0

同样的问题: /** * @ORM \多对多(targetEntity = “组”,inversedBy = “检查”) * @ORM \ JoinTable(名称= “checkfor”, * joinColumns = {@ ORM \ JoinColumn (name =“group”,referencedColumnName =“id”)}, * **/ 私人$团体; /** * @ORM \多对多(targetEntity = “检查”,的mappedBy = “组”) * @ORM \ JoinColumn(名称= “检查”,referencedColumnName = “集团”) **/ 私人$检查; – jsprds 2014-12-09 14:04:21

+0

你能更新你的问题吗?更易于阅读:) – Koalabaerchen 2014-12-09 14:27:23

+0

oops抱歉。更新了我的帖子。 – jsprds 2014-12-09 14:33:18