我有一个表 A,它引用了表 B。
编辑:使用的数据库引擎是 MyISAM。
Doctrine 映射就像一个魅力,除非我在数据库中有无效的情况,其中表 A 中的引用 ID 在表 B 中并不真正存在。
所以当你执行这段代码时:
$objectB = $objectA->getObjectB();//with lazy load
你实际上得到了 $objectB 代理对象,它是 而不是 null 。所以 !empty($objectB) 会通过。
当您尝试访问 $objectB 的任何属性时,例如:
你得到 Entity not found 异常。您无法在代码中预测 $objectB 实际上确实不存在 并且 $objectB 没有 Name 属性。
$objectB 实际上应该设置为 null 但这并没有发生。
Hibernate 实际上具有映射属性 not-found=ignore ,它将缺少的对象设置为 NULL 而不是将其设置为代理对象。 Doctrine 有类似的吗?
附注。当然,您始终可以捕获 Entity not found 异常,然后进行处理。或者您可以映射表 A 中的实际 objectB_ID 字段,但这些不是 100% 干净的解决方案。
我希望有人有答案。
谢谢你
最佳答案
IMO 这是一个垃圾进,垃圾出的案例。如果您的架构中 TableA 在 TableB 中可能有也可能没有行,则应在 TableB 上实现 FK 约束,以便如果从 TableB 中删除一行,则 TableA 中引用已删除行的任何行都将其值更改为 null。
如果您真的想推进您提议的架构实现,您可以尝试执行以下操作:
$rowExists = ($objectA->getObjectB()->getId() > 0) ? true : false;
这当然假设您在 tableB 上有一个 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/