Учение двунаправленное много ко многим

0

У меня двунаправленные отношения "многие ко многим" между "Группами" и "Проверками".

Таблицы базы данных:

+----------------+    +----------------+    +----------------+
|  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 (= не хорошо).

  • 0
    Вы пытались следовать примеру на этой странице один за другим? Избавьтесь от joincolumns, просто добавьте таблицу соединений и дайте ей имя. Также не забудьте иметь конструкторы
  • 0
    Та же проблема, и как я могу установить имена столбцов в нечто отличное от значения по умолчанию: "entity_id". Я изменил свои имена столбцов для этого теста.
Теги:
doctrine
doctrine2
doctrine-orm

1 ответ

0

Doctrine ManyToMany действительно существует, поэтому вам не нужно создавать третью сущность. он будет создан автоматически.

Ключевое слово для этого - @ORM\JoinTable

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

  • 0
    Та же проблема: / ** * @ORM \ ManyToMany (targetEntity = "Группа", inversedBy = "check") * @ORM \ JoinTable (name = "checkfor", * joinColumns = {@ ORM \ JoinColumn (name = "group") , referencedColumnName = "id")}, * inverseJoinColumns = {@ ORM \ JoinColumn (name = "check", referencedColumnName = "id", unique = true)} *) / private $ groups; / * @ORM \ ManyToMany (targetEntity = "Check", mappedBy = "groups") * @ORM \ JoinColumn (name = "check", referencedColumnName = "group") ** / private $ check;
  • 0
    Можете ли вы обновить свой вопрос? Легче читать :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню