- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我对 Symfony 和 Doctrine 还很陌生。我想知道是否有一种方法可以询问 doctrine 有哪些外键,而不必在模型中映射关系。
例如,假设您有 CoreBundle:Company
,它总是会出现,然后您有 OptionalBundle:Client
,它将使用 扩展 Company @OneToOne
映射关系,自己多加几个字段。问题是,由于 OptionalBundle
可能不存在,我不希望从 CoreBundle
到 OptionalBundle
的显式映射。
现在假设一个用户出现并试图删除 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/
我想知道存储库在 Doctrine 中意味着什么? 有人可以解释一下吗? 最佳答案 许多 ORM(对象关系映射器)使用的术语“存储库”, Doctrine 只是其中之一。 它意味着可以从数据存储库访问
我尝试使用 进行数据库查询 $position = $repository->findBy( array('id' => $profileId,'datum' => '10.07.2011')
几个月前,有一个命令可以将 Doctrine 1 架构文件转换为 Doctrine 2 实体,但是,该命令不再存在。 我刚刚开始使用 Symfony2 RC1。 有没有被删除的原因?我有一个 600
我有一个实体,称为 Stones,Stones 与 Attributes 有 ManyToMany 关系。 所以我查询实体以获取石头,然后将其水化以将其转换为数组。 $result = $t
我在 zend 框架 2 中使用了学说 2。要使用数据库表生成实体,使用的控制台命令是: php doctrine-module orm:convert-mapping --force --from-
我需要一个具体的代码示例,其中包含使用“多态关联”的 Doctrine 2。 让我澄清一下自己。我有一个名为 Contract 的实体,一个契约(Contract)可以有许多价格规则,这些价格规则可以
我知道条件过滤器尚不可用于查询(根据 Doctrine2 手册已知限制部分中的“26.1.4. Applying Filter Rules to any Query”),所以我想问问专家他们首选的解决
我在所有网络上搜索..但没有找到这个问题的回复。为了记录我的项目实体中的更改,我想使用 stof 条令扩展 - 可记录,但对我来说并不明显,实体的更改如何存储在数据库中?我可以定义我自己的历史表并在那
我使用两个类: namespace Test; use Doctrine\ORM\Mapping as ORM; /** *@Table() *@InheritanceType("Joined")
A previous question I asked与使用 Doctrine 和查询生成器时对结果集进行水化有关。我的问题是如何返回数组及其子集: 这是针对单个结果集的,答案很简单: $qb
我有两个实体 User和 Article多对多关系为 Article可以有很多作者。 class User { /** @var string */ public $name;
我有一个看起来像这样的查询: 我的用户实体具有如下所示的一对一关系: /** * @var UserProfile * * @ORM\OneToOne(targetEntity="UserPro
我最近正在阅读Doctrine 2's best practices并被此阻止: 25.3. Avoid composite keys Even though Doctrine fully suppo
如何在服务容器中使用 Doctrine? 该代码只会导致错误消息“ fatal error :调用未定义的方法 ...::get()”。 em = $em; } public func
向一条记录加载 Doctrine 的首选方式是什么? 我正在使用 $em = EntityManager::create($connectionOptions, $config); $dql = "s
我正在使用 Doctrine,并且想要记录所有生成的 SQL 查询。 我知道我可以使用 $q->getSqlQuery() 但我不想每次都手动执行此操作。 有没有办法自动完成? 最佳答案 如果您打开日
如何在 Doctrine 中找到分组最大值或包含最大值的行?在 SQL 中,我通常会使用自连接来执行此操作,如 here 中所述。 . 虽然可以在 Doctrine 中建立 self 关系,但有更好的
我在谷歌上浪费了数万亿个小时,但没有一个解决方案是好的。 我有这个查询生成器: $qb2=$this->createQueryBuilder('s') ->addSel
我有以下问题: 实体具有经典的创建/更新时间戳字段,应将其设置为 UTC 中的当前时间戳。 在实体上,我使用 columnDefinition 属性将它们设置为 "TIMESTAMP NOT NULL
我需要从多个相关表中执行 DQL 删除。 在 SQL 中,它是这样的: DELETE r1,r2 FROM ComRealty_objects r1, com_realty_objects_p
我是一名优秀的程序员,十分优秀!