【问题标题】:Finding out if an entity has relations - How to?找出一个实体是否有关系 - 如何?
【发布时间】:2017-05-15 07:09:15
【问题描述】:

我正在尝试找到一种方法来查找特定实体的关系,比如要删除的实体。

示例设置:

  • Country 实体可以有多个 Currencies
  • Currency 实体可以有Countries
  • Country 可能有一个主要的Currency

因此,设置为:Country <-> (1-n) <-> CountryCurrency <-> (n-1) <-> Currency

在上面的示例中,很容易找到要删除的国家/地区是否有任何关联的货币。

但是,假设以上内容是以全局方式设置的,并且可用于应用程序中的其他模块。

如果另一个模块,例如Address,在单向关系中使用了一个国家(Address 有一个Country):我如何才能确定特定的Country 实体可能不尝试就不会被删除,因此会收到Foreign Key constraint 错误

我希望 Doctrine 有内置的东西,但在文档中找不到它。谷歌搜索了一段时间也没有成功。始终处于以下趋势:“好吧,您只需 $entity->getSomeRelation()->count() > 0 就知道了”,但我正在寻找可以适用于任何实体的通用解决方案/方法。

【问题讨论】:

  • 搜索“php 学说元数据”。元数据描述了所有的关系。我对您的方法在实践中的实际效果持怀疑态度,但信息就在那里。
  • 有趣的信息,忘记了。但是,对于我的用例来说,这是错误的方式。将其应用于我的问题中的案例时,我看到我正在删除的 Country 中的所有信息。我没有看到与在其单向关系中使用CountryAddress 相关的结果。 (如associationMappings 属性中的ClassMetadata 实体中所见 -> 包含Country#coordinatesCountry#countryCurrencies 的链接)。如果您有其他想法,我很乐意为您指明正确的方向。
  • 我想您可以尝试使用 Doctrine Database Abstraction Layer 模式工具直接检查 sql 数据库中是否存在外键约束。 docs.doctrine-project.org/projects/doctrine-dbal/en/latest/… 但我仍然怀疑你的整个方法。你真的认为你会遇到这样的问题吗?只设置一个配置变量怎么样?

标签: zend-framework doctrine-orm zend-framework2


【解决方案1】:

没有通用的解决方案,因为它始终取决于您的业务模式。

删除有关系的实体会导致不同的场景:

  • 同时删除相关实体
  • 将关系设置为空
  • 或根本不允许删除。

因此,您可以根据自己的情况手动进行检查。

【讨论】:

  • 啊,但就是这样。我正在尝试创建可以在全球范围内使用的东西。类似于$entity->isUsedByForeignKeys()$entity->canBeDeleted()$entity->hasAssociationsPointedAtIt()。可以在全球范围内使用的东西,因为它可能是这样编写的,当(在我的问题示例中)您尝试删除Address 使用的Country 时,检查MySQL 所做的方式,而不首先知道后者。如果您对这个方向有任何指示,我会全力以赴。
  • 我理解你,但恐怕这不是一个好的方向:)。如果你真的想实现它,我建议从学说元数据开始。您可以检索有关所有已定义关联的信息。拥有此数据后,您可以构建需要检查每个实体的实体列表。 (建立一个列表不会是一个简单的操作,所以你应该缓存它并确保当你的模型改变时缓存被更新)然后编写检查它的函数。您可能会面临复合键、级联操作和性能方面的问题。祝你好运。
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 2013-05-10
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2014-01-15
  • 1970-01-01
相关资源
最近更新 更多