Gor*_*ran 4 php mapping orm doctrine
我有一张表A,它引用了表B.
编辑:使用的数据库引擎是MyISAM.
Doctrine映射的工作方式类似于charm,除非我在DB中有无效的情况,表A中的引用ID实际上不存在于表B中.
所以当你执行这段代码时:
$objectB = $objectA->getObjectB();//with lazy load
Run Code Online (Sandbox Code Playgroud)
你实际上得到$ objectB代理对象,它不是null.所以!empty($ objectB)将通过.
当您尝试访问$ objectB的任何属性时,例如:
$ objectB->的getName();
你得到实体未找到例外.你无法在代码中预测$ objectB实际上不存在,并且$ objectB没有Name属性.
实际上$ objectB应该设置为null但是没有发生.
Hibernate实际上映射了属性not-found = ignore,它将缺少的对象设置为NULL,而不是将其设置为Proxy对象.Doctrine有类似的东西吗?
PS.当然,您总是可以捕获实体未找到的异常,并使用它.或者您可以映射表A中的实际objectB_ID字段,但这些不是100%干净的解决方案.
我希望有人有答案.
谢谢
除非我在DB中有无效的情况,表A中的引用ID实际上不存在于表B中
IMO这是一个垃圾进出,垃圾出来的情况.如果TableA中TableA可能有或可能没有TableB中的行,则应在TableB上实现FK约束,以便在从TableB中删除行时,TableA中引用已删除行的任何行都将其值更改为null.
如果您真的想继续推进您提出的架构实现,可以尝试:
$rowExists = ($objectA->getObjectB()->getId() > 0) ? true : false;
Run Code Online (Sandbox Code Playgroud)
这当然假设你在tableB上有一个id列,并且它是无符号的.
- 更新 -
try {
$objectB = $objectA->getObjectB();
} catch (Exception $e) {
$objectB = null;
}
if ($objectB instanceof ClassB) {
// Do work
}
Run Code Online (Sandbox Code Playgroud)