php - 学说:同一个属性可以与两个不同的目标属性建立关系吗?
问题描述
这种 OneToOne 关系是否可能与 Doctrine(在 Symfony 中)?
User Time
+----------+ +-------+
| ... | | ... |
| time_id |o-----+-----o| user |
| | | | ... |
| time2_id |o-----+ | type |
| ... | +-------+
+----------+
也就是说,一个用户可能有两个与之关联的不同时间实体:一个是 type=0,另一个是 type=1。
我本可以将 Time 拆分为两个不同的实体,但我认为这样我可以省去复制一些代码,因为 Time 实体有一个 eventListener 和更多相关的代码......
我已经这样编码了:
class Time
{
...
/**
* @ORM\OneToOne(targetEntity=User::class, mappedBy="time, cascade={"persist"})
* @ORM\OneToOne(targetEntity=User::class, mappedBy="time2", cascade={"persist"})
*/
private $user;
...}
class User
{
...
/**
* @ORM\OneToOne(targetEntity=Time::class, inversedBy="user", cascade={"persist"})
* @ORM\JoinColumn(name="time_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time;
/**
* @ORM\OneToOne(targetEntity=Time::class, inversedBy="user", cascade={"persist"})
* @ORM\JoinColumn(name="time2_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time2;
...}
事实上,我完美地使用它,但 Symfony 默默地抱怨(在Symfony 工具栏/Doctrine/Entities Mapping > Mapping errors 中):
App\Entity\User
The mappings App\Entity\User#time2 and App\Entity\Time#user are inconsistent with each other.
显然,Doctrine 不喜欢$user上的第二个@ORM\OneToOne,并且正在丢弃它。
这段代码会导致哪些假设性的不当行为?
注意:学说/通用 v2.11
解决方案
FWIW,只要放弃逆关系部分,就可以建立这种关系:
User Time
+----------+ +-------+
| ... | | ... |
| time_id |o-----+-----o| |
| | | | |
| time2_id |o-----+ | type |
| ... | +-------+
+----------+
实施者:
class Time
{
...
}
class User
{
...
/**
* @ORM\OneToOne(targetEntity=Time::class, cascade={"persist"})
* @ORM\JoinColumn(name="time_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time;
/**
* @ORM\OneToOne(targetEntity=Time::class, cascade={"persist"})
* @ORM\JoinColumn(name="time2_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time2;
...}
另请查看此链接以了解Owning vs Inverse 关系。
就我而言,这完全符合我的需求,因为相反的部分适用于以下方法:
$Time->getUser();
我可以预测。
推荐阅读
- cordova - 科尔多瓦没有待机智能手机
- c++ - cmake 外部(git)项目作为依赖项
- javascript - 删除与我在另一个集合中删除的文档相关联的所有字段
- jenkins - 获取 org.hidetake.groovy.ssh.session.BadExitStatusException:命令返回退出状态 1:在 Jenkins 管道执行中
- python - RadioButton tkinter:字符串索引必须是整数
- vstest - azure devops 发布管道中的 VSTest 任务问题
- rust - 由于权限提升,更改 PDA 拥有的令牌帐户权限失败
- spring - Spring Data JPA saveAll/Save 方法作为批量插入
- .htaccess - 如何将一些子域页面重定向到另一个页面 htaccess
- image - 如何在颤动中将图像大小压缩到 5MB