我有一个引用表 B 的表 A。
编辑:使用的数据库引擎是 MyISAM。
Doctrine 映射就像一个魅力,除非我在数据库中有无效的情况,表 A 中引用的 ID 在表 B 中并不存在。
所以当你执行这段代码时:
$objectB = $objectA->getObjectB();//with lazy load
您实际上得到了 $objectB 代理对象,它不为空。所以 !empty($objectB) 将通过。
当您尝试访问 $objectB 的任何属性时,例如:
$objectB->getName();
您得到未找到实体异常。您无法在代码中预测 $objectB 实际上不存在并且 $objectB 没有 Name 属性。
$objectB 实际上应该设置为 null,但事实并非如此。
Hibernate 实际上有映射属性 not-found=ignore 将丢失的对象设置为 NULL 而不是将其设置为 Proxy 对象。 Doctrine 有类似的东西吗?
附言。当然,您始终可以捕获 Entity not found 异常,并尝试使用它。或者您可以在表 A 中映射实际的 objectB_ID 字段,但这些都不是 100% 干净的解决方案。
我希望有人能给出答案。
谢谢
最佳答案
except when I have non valid case in the DB where referenced ID in table A does not really exist in table B
IMO 这是一个垃圾进,垃圾出的情况。如果您的架构中 TableA 在 TableB 中可能有也可能没有行,则您应该在 TableB 上实现 FK 约束,这样如果从 TableB 中删除了一行,则 TableA 中引用已删除行的任何行的值都将更改为 null。
如果您真的想推进您提议的模式实现,您可以尝试这样做:
$rowExists = ($objectA->getObjectB()->getId() > 0) ? true : false;
这当然假设您在表 B 上有一个 id 列并且它是未签名的。
-- 更新--
try {
$objectB = $objectA->getObjectB();
} catch (Exception $e) {
$objectB = null;
}
if ($objectB instanceof ClassB) {
// Do work
}
关于php - 未找到 Doctrine 映射案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057504/