- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个单表继承问题,我不确定我是否正确地解释了文档。
首先:我没有在这里详细复制我的代码/实体映射(甚至使用正确的语法),因为我认为可以更好地抽象地传达问题。 如果这无论如何都不能接受,请说出来,我将添加完整的代码 - 但它很长,我认为没有它也可以回答我的问题。
如果有帮助我会画画 一个 ER 图来尝试传达我正在尝试做的事情。 如果您阅读以下内容并认为“嘿,这应该行得通”——请告诉我,我会上传真实代码
第二: 我不在任何地方使用延迟加载。在访问我的实体之前,我确保通过预先编写 DQL 来加载我将要访问的每个相关实体 - 因此以下问题对我的应用程序来说是相当重要的)
设置:
我有一些实体 - 它们构成了我的应用程序的核心。
// @entity AnimalTrainingSchool
// oneToMany: trainingDepartment
fields: [name / location / year founded]
// @entity trainingDepartment
oneToMany: animalTrainer
oneToOne: building
fields: [capacity]
// @entity animalTrainer
fields: [name / age / qualification]
我经常在不同的上下文中访问它们 - 但我通常遍历级别并访问这些实体的属性和关系。
foreach ($animalTrainingSchool as $school){
echo $school->getName() . ' at ' . $school->getLocation();
echo 'These are the training departments for this school:';
foreach ($school->getTrainingDepartments as $trainingDepartment){
echo $trainingDepartment->getAnimalTypeTrained() . ' are trained in this department';
}
}
我通过形成我的 DQL 并执行它来确保所有这些都预先加载 - 以限制 SQL 查询的数量(一个)。这一切都很好(相当标准的东西)。
DQL Example : "SELECT ats, td, at FROM AnimalTrainingSchool ats JOIN AnimalTrainingSchool.trainingDepartments td JOIN td.animalTrainer at";
这设置了我的集合,意味着我可以遍历它而无需发出额外的查询
问题:
我已经在我的应用程序的其他地方映射了其他实体 - 与此非常相似(注意:我的总体问题与下面的问题非常相似,只有一个主要区别(见下文)
Doctrine 2 Inheritance Mapping with Association
// NB: new awards are issued each time they are awarded - so it is meant to be a oneToOne relationships - the awards are unique
// @entity award
{id information / table information / discriminator map / inheritance type (SINGLE_TABLE)}
fields: [medalMaterial / award_serial_number]
//departmentAward extends award
oneToOne: trainingDepartment
//trainerAward extends award
oneToOne: animalTrainer
然后我通过修改我的初始实体使关系成为双向的
// @entity trainingDepartment
oneToMany: animalTrainer
oneToOne: building
oneToOne: departmentAward
fields: [capacity]
// @entity animalTrainer
fields: [name / age / qualification]
oneToOne: trainerAward
发生了什么
现在,当我以与上述完全相同的方式访问我的原始实体时 - 他们会自动(急切地)加载相关实体以获得他们的奖励,尽管我没有告诉他们这样做。当我遍历一大堆 trainingDepartments/AnimalTrainers 和 Doctrine 正在为每个实体执行 SQL 语句时,这尤其糟糕。
对于 20 个部门,每个部门有 10 名培训师 - 这是 200 个额外的查询。
//Given the exact same DQL and foreach loop as above (note that at no stage am I accessing awards) - I get a ton of extra queries that look like this
"SELECT award.property1, award.property2, award.property3 FROM awardTable LEFT JOIN trainingDepartmentTable ON award.awardee_id = trainingDepartmentTable.id and award.discriminatorColumn IN ('departmentAward')";
// or...
"SELECT award.property1, award.property2, award.property3 FROM awardTable LEFT JOIN animalTrainerTable ON award.awardee_id = animalTrainerTable.id and award.discriminatorColumn IN ('trainerAward')";
生成的内容没有一个是不正确的 - 只是阅读了以下问题,在我看来我已经按照文档描述的方式设置了它(并且与@Matthieu相反;即 - 如果我相关我最初的 3 个实体到最低级别的实体而不是“奖励”基类,那么他们应该能够使用代理而不是尝试急切地加载实体。
Stackoverflow 问题与我所描述的相反
Doctrine 2 Inheritance Mapping with Association
相关理论文档
There is a general performance consideration with Single Table Inheritance: If you use a STI entity as a many-to-one or one-to-one entity you should never use one of the classes at the upper levels of the inheritance hierachy as “targetEntity”, only those that have no subclasses. Otherwise Doctrine CANNOT create proxy instances of this entity and will ALWAYS load the entity eagerly.
在我看来,无论您是加入基本级别的实体还是子类实体 - Doctrine 都会急切地加载关联并且不会尝试使用代理。
再说一次:我可以发布真实代码 - 但考虑到问题的长度,我觉得最好不要发布。非常感谢任何输入。
最佳答案
oneToOne 关系的反面不能延迟加载。为了支持延迟加载,Doctrine 需要创建一个代理对象,但是代理对象需要有一个与之关联的标识符。在 oneToOne 关系的情况下,标识符仅在拥有方可用。所以必须急切加载反向关系。
如果可能,您应该尝试获取加入这些协会。 2.1 版将自动强制获取反向 oneToOne 关系的连接。
关于orm - Doctrine ORM Single Table Inheritance association problem (always Eager loading contractoring to documentation)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380097/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我有四个模型类: class Group :event_producer end class PersonalBlog :event_producer end class Event true
将应用程序从Rails 4.2.9升级到Rails 5.2.1。 通过大部分令人讨厌的部分,更新了依赖关系和诸如此类的东西,最终使应用程序在console中运行,现在尝试访问server上的页面。加载
我的 EntityDefinition 中有一个关联: ... class ParentEntityDefinition extends EntityDefinition { ...
我不确定为什么这个关联无效 class Tag < ActiveRecord::Base has_and_belongs_to_many :routes end class Route < Act
我有以下关联。 PropertyOwner 是一个连接模型,它属于一个属性(property),多态地属于一个所有者,在下面的例子中是一个 ForeclosureDefense。一切正常,直到我拥有
我有一份有很多发票的工作,一张发票属于一份工作。我想查询第一张发票在某个日期范围内的工作。我有这个查询: @jobs = Job.joins(:invoices). where("invoices
我有这样的关系:用户可以拥有零只或一只狗,但狗必须属于某人。 # dog.rb class Dog { joins(:dog) } # To get records without a dog,
在我的 Rails 4 应用程序中,我有以下模型: User has_many :administrations has_many :calendars, through: :administrati
我见过的所有示例,包括文档都建议按关联过滤应使用以下语法 [contrived exampled] User.findAndCountAll({ include: [ {
我有一个下拉列表(HTML 选择框),它从这个 MySQL 查询中获取值: "SELECT cdID, cdTitle FROM CD ORDER BY cdID" 然后将结果存储在关联数组中,然后将
我是 Ruby ON Rails 新手,我的应用有 3 个模型 class User < ActiveRecord::Base has_one :user_hobby has_one :user_
我有三个模型,每个模型都有以下关联: class Model1 :model1 # will this work? is there any way around this? end class
我有一个带有帖子和标签的数据库。我想找到的帖子,只包含一个标签与一个特定的TagID,根本没有其他标签。下面的代码可以工作,但它需要服务器手动过滤结果,这将使分页变得困难。有谁有可以做到这一点的直接查
任何人都知道如何避免 PLS-00312 错误? “PLS-00312:位置参数关联可能不遵循命名关联” 我得到这个是因为下面一行: AttachList=> v_est_proc_name||'_E
我有以下工厂定义。 Factory.define :status do |f| end Factory.define :my_status , :parent => :status do |f|
我有 2 个具有 1:M 关联的模型,定义如下: var inventory = sequelize.define("Inventory",{**model definition**}; var tr
假设这个模式: var user = sequelize.define('user', { username: Sequelize.STRING, email: Sequelize.S
我正在使用 Apple 的工具进行应用站点关联验证,该工具位于此处:https://search.developer.apple.com/appsearch-validation-tool 它给了我错
实体\识别 /** * @ORM\Entity * @ORM\Table(name="c_rcgntn") */ class Recognition { /** * @ORM\
我是一名优秀的程序员,十分优秀!