为啥我的集合中会出现空对象多对多

Posted

技术标签:

【中文标题】为啥我的集合中会出现空对象多对多【英文标题】:Why do I get empty objects in my collection Many-to-Many为什么我的集合中会出现空对象多对多 【发布时间】:2018-04-03 21:58:54 【问题描述】:

我的收藏中有空的对象。我有一个多对多关系并更新了我的架构..

我有 2 个实体;

空缺 聚会

一个空缺可以有超过 1 个聚会。

我的空缺实体;

/**
 * @var Collection
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Meetup", inversedBy="vacancies", cascade="persist", indexBy="id", fetch="EAGER")
 */
private $meetups;

Vacancy 实体的构造函数;

public function __construct()

    $this->meetups = new ArrayCollection();

getter 和 setter;

/**
 * @return Collection
 */
public function getMeetups()

    return $this->meetups;


/**
 * @param Meetup $meetup
 */
public function addMeetup(Meetup $meetup)

    $this->meetups->add($meetup);


/**
 * @param Meetup $meetup
 */
public function removeMeetup(Meetup $meetup)

    $this->meetups->removeElement($meetup);

我的聚会实体;

/**
 * @var Collection
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Vacancy", inversedBy="meetups", cascade="persist")
 */
private $vacancies;

在我的存储库中,我正在做这样的事情;

$qb = $this->createQueryBuilder('group');
$qb->innerJoin('group.vacancies', 'vacancy');
$qb->innerJoin('vacancy.meetups', 'm');

我的结果是这样的;

"meetups": [
        ,
        ,
        
      ],

这种关系有什么问题?我有 3 条记录,我得到 3 个空对象。 任何帮助将不胜感激!

编辑:我的序列化文件看起来像; (这是我的 Vacancy 序列化文件)

clubhouseMeetups: expose: true groups: [app,vacancies]

【问题讨论】:

请给我们提供这个输出的代码,这似乎是一个序列化问题。问题不是来自您的存储库,因为您有 3 个输出 这是我的序列化代码; getMeetups: serialized_name: meetups groups: [vacancies] 你能用配置更新你的问题吗^^' 没有缩进就无法阅读 @Mcsky 我更新了我的问题! 还有控制器的动作代码^^' 【参考方案1】:

1/ 您的多对多关系不正确。当你有一个双向多对多时,你应该有一个 inversedBy 和一个 mappedBy 在另一边(参见 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional)。

/**
 * @var Collection
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Vacancy", mappedBy="meetups", cascade="persist")
 */
private $vacancies;

2/ 如果您尝试使用您的 Meetup 实体来添加 Vacancy 您相同的 getter 和 setter 将不起作用,因为您需要在两个方向上添加对象

/**
 * @param Vacancy $vacancy
 */
public function addVacancy(Vacancy $vacancy)

    $vacancy->addMeetup($this);
    $this->vacancies->add($vacancy);

inversedBy 不需要这样做,如果您执行相同的代码,您将有一个无限循环。最好的解决方案(我认为)是只为这种关系使用一个入口点,在其上使用inversedBy,同时在另一侧添加对象,从不使用另一侧。

【讨论】:

感谢您的快速回答!不幸的是,我照你说的做了;添加一个 inversedBy 和 mappedBy,但仍然得到相同的输出.. 可能有什么问题?在这种情况下,setter 并不重要,但我真的想要我的多对多关系的输出。 我的回答只是为了保存。如果您正确保存了录音,但只是输出问题,那是由于您的序列化。你的配置是什么?我不认为 Symfony 的序列化程序组件可以自动处理多对多关系,因为还有一个无限循环(空缺有空缺的聚会......)。所以你应该配置你的序列化并且不要显示聚会序列化的空缺 谢谢!果然是连载!【参考方案2】:

我的聚会没有序列化文件,但是当我添加它时,它起作用了!感谢您提到序列化家伙!

【讨论】:

没问题,我们是自助的;)

以上是关于为啥我的集合中会出现空对象多对多的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SqlAlchemy 中的多对多集合中删除所有项目?

Remove() 不适用于实体框架中的多对多关系

将对象添加到具有多对多关系的核心数据中的 NSSet

hibernate中对象与对象的关系:list,一对一,多对多

SQLAlchemy 增删改查 一对多 多对多

框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)