У меня двунаправленные отношения "многие ко многим" между "Группами" и "Проверками".
Таблицы базы данных:
+----------------+ +----------------+ +----------------+
| GROUP | | CHECKFOR | | CHECK |
+----------------+ +----------------+ +----------------+
| id | | group | | id |
| name | | check | | description |
| next | | | | 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;
}
проверить
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] []
Обновление: я нашел проблему! "Проверки" - это постоянные коллекции, а не коллекции массивов. Постоянная коллекция не работает с сериализатором JMS. Когда я печатаю дамп объекта группы, я вижу 2 запроса в dev_log (= правильно). Когда я анализирую объект с помощью сериализатора, я вижу запросы +10 (= не хорошо).
Doctrine ManyToMany действительно существует, поэтому вам не нужно создавать третью сущность. он будет создан автоматически.
Ключевое слово для этого - @ORM\JoinTable