草庐IT

php - Doctrine 2 Symfony 2 在没有映射的情况下获取外键实体

coder 2023-10-22 原文

所以我对 Symfony 和 Doctrine 还很陌生。我想知道是否有一种方法可以询问 doctrine 有哪些外键,而不必在模型中映射关系。

例如,假设您有 CoreBundle:Company,它总是会出现,然后您有 OptionalBundle:Client,它将使用 扩展 Company @OneToOne 映射关系,自己多加几个字段。问题是,由于 OptionalBundle 可能不存在,我不希望从 CoreBundleOptionalBundle 的显式映射。

现在假设一个用户出现并试图删除 Company(5)。如果实体被完全映射,它会通过级联删除两者,但由于 bundle 不会意识到映射关系,它最终只会删除公司 - 我想产生一个错误而不是级联删除。

如果这很容易实现,那么我还想更进一步,说哪些实体(class 和 id)有外键,我可以向用户显示数据,比如

@CoreBundle:Company(5) ->
    has @OptionalBundle:Client(3) linked, and
    has @AnotherOptionalBundle:Supplier(12) linked

我的第一直觉是为外键执行自定义 INFORMATION_SCHEMA 查找,但这只会给我表名...

PS 我真的不想使用任何第三方供应商,因为我喜欢尝试降低依赖性,即使这意味着重新发明轮子

最佳答案

问题一

您可以将Client 设置为一对一关系的所有者。但是,根据您的用例,它可能并不理想,但如果它适合您,它确实是最简单的解决方案,如 ABM_Dan 所指出的。

除此之外,最好的选择可能是使用 Doctrine event subscribers并 Hook preDelete 事件,在 Company 本身被删除之前,您将在其中删除关联的 Client - 如果级联删除确实是你想要什么。

默认情况下,这两个删除将在同一个 Doctrine 事务中,这意味着如果在删除 Company 时出现问题,则 Client 删除将被取消。

如果你真的想触发错误而不是这种“手动级联”,也可以在 Doctrine 订阅者的 preDelete 方法中实现。

订阅者类可以驻留在您的可选包中,即使它会作用于与 Company 关联的事件。

Doctrine 事件订阅者与常规的 Symfony 事件系统是分开的。新手往往意识不到它的存在,但它可以实现很多有趣的事情。

问题二

仍然在您的事件订阅者中,可以 Hook postLoad 事件。这将允许您请求数据库并将相关实体直接加载到 Company 中。您可以在每个需要它的包中为 Company 创建一个事件订阅者。

虽然这是可能的,但我真的想知道是否有更好的方法。使用 decorators可能是更好的解决方案。我找到了一个 Doctrine cookbook article关于它。

关于php - Doctrine 2 Symfony 2 在没有映射的情况下获取外键实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132874/

有关php - Doctrine 2 Symfony 2 在没有映射的情况下获取外键实体的更多相关文章

  1. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  2. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  3. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  4. ruby - 在什么情况下会使用 Sinatra 或 Merb? - 2

    我正在学习Rails,对Sinatra和Merb知之甚少。我想知道您会在哪些情况下使用Merb/Sinatra。感谢您的反馈! 最佳答案 Sinatra是一个比Rails更小、更轻的框架。如果你想让一些东西快速运行,只需发送几个URL并返回一些简单的内容,就可以使用它。看看Sinatrahomepage;这就是启动和运行“Hello,World”所需的全部内容,而在Rails中,您需要生成整个项目结构、设置Controller和View、设置路由等等(我还没有有一段时间写了一个Rails应用程序,所以我不知道“Hello,World

  5. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  6. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  7. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  8. ruby - 在没有 root 的情况下安装 Jekyll - 2

    我想在共享服务器上建立一个jekyll博客。当我尝试安装Jekyll时,我得到“您没有写权限”。我该如何在没有root或sudo的情况下解决这个问题?更多细节:我在共享服务器上有空间,但没有根访问权限。我无法安装Ruby,尽管托管公司应我的要求安装了它。当我尝试安装Jekyll时我使用user@hosting.org[~]#geminstalljekyll这是我得到的回应:ERROR:Whileexecutinggem...(Gem::FilePermissionError)Youdon'thavewritepermissionsintothe/usr/lib/ruby/gems/1.

  9. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  10. ruby - 为什么 Minitest 的 assert_raises 在这种情况下没有按预期工作? - 2

    我正在尝试使用ActionControllerbugreporttemplate解决Rails中的一个奇怪行为.为了记录,这是模板中的Controller:classTestController我已经为缺失的Action添加了一条路线:routes.drawdoget'/'=>'test#index'get'/missing'=>'test#missing'end并且我试图断言AbstractController::ActionNotFound在遵循该路线时被引发:classBugTest预期行为:绿色测试。实际行为:#Runningtests:D,[2014-04-24T09:17:

随机推荐