如何检测实体是否存在于数据库中

How to detect if entity exist in database

我有 2 个实体,用户和配置文件。配置文件与用户有 in-symfony 关系,但没有数据库内关系(没有外键,没有级联)——只有名为 user_id 的简单 int 列,仅此而已。

问题很明显:当我删除用户时 - 关联的配置文件仍然存在,但它们 user_id 指向不存在的用户行。

因为当我从数据库中获取配置文件时我使用了 in-symfony 关系,它也获取了相关的用户实体。我预计如果没有具有特定 ID 的行,它只会保留 null 或至少抛出异常或其他东西。

问题在于 symfony 创建了仅设置了 id 的空用户实体对象。它的其余字段为空。

我知道解决方案是创建 FK、约束等...但我不允许触及数据库架构中的任何内容。

我该如何解决这个问题?我什至可以留下那些空对象,只要我有简单的方法来确定它们是否存在于 TWIG 内的数据库中——这样我就知道我是否可以显示 {{ profile.user.email }} 例如。

如您所问,快速而肮脏的解决方案是使用此测试:http://twig.sensiolabs.org/doc/tests/defined.html 但我强烈建议重新处理您的实体关系。

找到解决方案:它的提取:EAGER 设置为原则中有问题的映射。

默认情况下,学说使用 LAZY 获取导致使用学说为相关实体生成的代理 classes 的结果。 class 几乎与真实实体 class 相同。区别在于 getter 方法内部,在返回值之前执行从数据库中获取实体。

此时,当您在此类代理上调用 getter 时,学说会尝试使用其 ID 在数据库中查找实体,并且由于未找到任何内容,因此会抛出异常。

当使用 EAGER 提取原则时,它会在提取主要实体的同时执行相关实体的提取,如果找不到它,则在关系字段上设置 null。