我有一个表 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/

10-09 15:18