学说映射未找到案例

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%干净的解决方案.

我希望有人有答案.

谢谢

Mik*_*ell 7

除非我在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)