Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2/Doctrine2-多通-保存反向端_Symfony_Doctrine Orm_Entity_One To Many_Many To One - Fatal编程技术网

Symfony2/Doctrine2-多通-保存反向端

Symfony2/Doctrine2-多通-保存反向端,symfony,doctrine-orm,entity,one-to-many,many-to-one,Symfony,Doctrine Orm,Entity,One To Many,Many To One,我不熟悉Symfony和学说 我有一个实体“用户”和一个实体“类型”。一个用户可以有一个收藏夹类型,一个类型可以有多个用户将该特定类型作为收藏夹。所以我需要一个多(用户)对一(类型)的关系 我实现了它,它工作得很好(大部分)。但有一件事我不明白 如果我做了这样的事情,它会起作用: $user = new User(); $type = new Type(); $user->setFavoriteType($type); $em->persist($user); $em->pe

我不熟悉Symfony和学说

我有一个实体“用户”和一个实体“类型”。一个用户可以有一个收藏夹类型,一个类型可以有多个用户将该特定类型作为收藏夹。所以我需要一个多(用户)对一(类型)的关系

我实现了它,它工作得很好(大部分)。但有一件事我不明白

如果我做了这样的事情,它会起作用:

$user = new User();
$type = new Type();

$user->setFavoriteType($type);
$em->persist($user);
$em->persist($type);
$em->flush();
对象被生成并存储到数据库中。并且正确设置了收藏夹类型id。 因此,更改所属方的工作方式与预期一致

但是,如果我将用户添加到反向端(仅)并刷新实体管理器,则不会设置收藏夹类型id

$user = new User();
$type = new Type();

$type->getUsers()->add($user); //same with $type->addUser($user);
$em->persist($user);
$em->persist($type);
$em->flush();
为什么呢?有没有一个原因,为什么它不能从反面工作?我真的需要手动设置吗?如果我在类型实体中操作addUser方法,比如“$user->setFavoriteType($this)”,它就会工作。但这不应该是教义的任务吗

文件上说

当一个双向关联被更新时,条令只检查双方中的一方是否有这些变化。这称为关联的拥有方

所以这似乎是被通缉的行为,对吗?但是为什么呢?由于性能原因?语义原因


如果有人能向我解释一下,或者告诉我我做错了什么,我会很高兴的。

请查看。通过添加
cascade={“persist”}
并清除缓存(以重建条令的元数据缓存),这将帮助您快速轻松地开始您想要做的事情。

这是因为基本上,在考虑持久性时,条令将PHP实体直接映射到数据库表。在您的例子中,用户和类型在概念上具有多对一关系,但在数据库级别,该关系完全在用户表上表示-用户具有收藏类型,因此用户表具有
favorite\u type\u id
列。虽然我们可以认为类型实体有一个他们最喜欢的用户列表,但这基本上也是通过查看用户表得到的,类型表中没有任何内容

在Doctrine中设置实体映射会告诉Doctrine实体之间的关系,并允许Doctrine为您提供某些方便的访问方法,如
$type->getUsers()
,但不会更改基础数据的存储方式。如果我使用
$user->setFavoriteType
我正在处理有直接数据库对应关系的数据,但是默认情况下,如果我调用
$type->addUser
我不是-进行这种开箱即用调用的主要目的是使您当前正在处理的水合实体保持最新,而不是简单地将对象扔掉并再次从数据库中获取它们


当然,您已经看到,您可以定制
addUser
,也可以调用
setFavoriteType
,或者按照Shon M的建议配置级联持久性,使行为更像您可能期望/想要的那样。从一开始就忽略这一点似乎是浪费时间,但我怀疑开发人员有意识地选择了以最简单的方式实现所需的功能,同时提供了几种简单的替代方案(如果这正是您所追求的),从而以某种方式满足每个人的需求。不管你喜欢与否,数据库中的数据和PHP中运行的数据在技术上是不同的,特别是在一个类似于模型的原则中,数据库活动被推迟到开发人员请求时,并且尽可能明确所有这些都是很有意义的

有趣的问题,我也很好奇这个逻辑背后的选择。你能告诉我们相关的实体吗?