与 Doctrine ORM 的多对多关系,不返回对象

问题描述 投票:0回答:0

我遇到一个我不明白的问题。我花了几个小时才在这里发帖。

我尝试在事件和主题之间建立多对多关系。一个事件可以链接到几个主题,一个主题又链接到几个事件。我尝试建立单向和双向关联,但都没有用。如果我可以选择,我更喜欢事件类的拥有方。

这是我的 SQL 代码:

CREATE TABLE `event` (
  `id_evenement` int(11) NOT NULL,
  [...]
);

CREATE TABLE `theme` (
  `id_theme` int(11) NOT NULL,
  [...]
);

CREATE TABLE `events_themes_link` (
  `id_evenement` int(11) NOT NULL,
  `id_theme` int(11) NOT NULL
);

-- Primary keys
ALTER TABLE `event`
  ADD PRIMARY KEY (`id_evenement`);

ALTER TABLE `theme`
  ADD PRIMARY KEY (`id_theme`);

ALTER TABLE `events_themes_link`
  ADD PRIMARY KEY (`id_evenement`, `id_theme`);

-- Constraints
ALTER TABLE `events_themes_link`
  ADD CONSTRAINT `fk_id_evenement` FOREIGN KEY (`id_evenement`) REFERENCES `event` (`id_evenement`),
  ADD CONSTRAINT `fk_id_theme` FOREIGN KEY (`id_theme`) REFERENCES `theme` (`id_theme`);
COMMIT;

我的 PHP 课程:

Event.php

/**
 * Many Themes have Many Evenements.
 * @ManyToMany(targetEntity="Theme", inversedBy="evenements")
 * @JoinTable(name="events_themes_link",
 *     joinColumns={@JoinColumn(name="id_evenement", referencedColumnName="id_evenement")},
 *     inverseJoinColumns={@JoinColumn(name="id_theme", referencedColumnName="id_theme")}
 *  )
 */
private $themes;

Theme.php

/**
 * Many Theme have Many Evenement.
 * @ManyToMany(targetEntity="Event", mappedBy="themes")
 */
private $evenements;

主要问题是,当从 EventRepository 调用我的函数 findEvent 时,查找事件 ID 8:

public function findEvent($id)
{
    $qb = $this->createQueryBuilder('e')
        ->leftJoin('e.themes', 't')
        ->addSelect('t')
        ->where('e.id_evenement = :idEvenement')
        ->setParameter('idEvenement', $id);

    return $qb->getQuery()->getResult();
}

我有:

[{"id":8,[...],"themes":{}}]

主题变量为空。而在我的 SQL 数据库中,events_themes_link 表如下所示:

id_evenement id_theme
8 4
8 5
9 4

应该出现2次。 我不明白为什么我的themes参数总是空的.. 如果有人能帮助我,我会很高兴。

谢谢!

尝试过单向和双向多对多关联 试图在两个类(事件或主题)中添加/删除 JoinColumn/InverseJoinColumn

themes
变量不应为空,并且应包含 ID 为 4 和 5 的主题对象数组(因为数据库中有一个链接),事件 ID 为 8。

php doctrine-orm repository
© www.soinside.com 2019 - 2024. All rights reserved.