问题标签 [hydration]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 接收到的数据正确时不正确的 Doctrine2 水合
编辑 2018-05-22:没有答案完全修复的问题 - 无法再复制问题,因为不再有访问权限。不根据此元讨论删除
请不要花费时间/精力来创建答案
@Wilt 的回答中的讨论使我了解了我现在对使用鉴别器的了解,它可能对未来的提问者有所帮助。就我而言,它有所帮助,但没有提供答案。
我遇到了一些复杂的问题,即从客户端接收到的数据的水合不正确。我一直在尝试解决这个问题近一个星期,所以我想问问你们。
我们有这个应用程序允许为学生创建作业。作业可能包含问题、文本项目、媒体项目等。问题在于问题和相关的答案。
设想
任务
- 问题表 1 (L1)
- 问题 1 (L1 - V1)
- 答案 A (L1 - V1 - A1)
- 答案 B (L1 - V1 - A2)
- 问题 2 (L1 - V2)
- 答案 A (L1 - V2 - A1) (只有 1 个答案)
- 问题表 2 (L2)
- 问题 1(……等等)
- 答案 A
- 答案 B
- 问题2
- 答案 A
- 答案 B
- 问题 3
- 答案 A
- 答案 B
以上从客户端正确发送。该数据的截图:
需要注意的是,正如您在上面看到的,aQuestion
实际上是一个GridElements
实体。它也可能是Text
or Image
,这是基于type = question
a的属性Discriminator
。
水合数据后,我们得到以下实体结构:
如您所见,水合后数据不再正确。这是在$form->isValid()
. QuestionSheet 1
包含第一个Question
forQuestionSheet 2
并且Question
具有第二个Answer
的第三个Question
中的第一个QuestionSheet
。
在阅读完整的水合数据集时,我看到Answers
为第一个创建的数据集QuestionSheet
已被删除。第二Answers
个QuestionSheet
已被复制并覆盖了第一个问题表中的答案。本质上,您在上图中看到的内容。
更糟糕的是
以下是上述之后保存到数据库中的所有数据,上面提到的场景是2个列表,5个问题和9个答案。
所以第一个问题,没有问答。第二个 QuestionSheet 的问题已用于覆盖它们。此外,只有最后 2 个答案在那里,填补了应该是 9 的空间!。
顺便说一句,返回 this 的查询完全LEFT JOIN
是为了显示所有空数据,仅此而已。
似乎它抓住了最后一组任何子实体来填充以前的实体或其他东西。我迷路了。
这怎么可能?
正如我所提到的,我已经做了很长时间,但找不到解决方案。希望大家能帮忙。
如果您需要有关代码的任何信息,我会尽力在此处显示或在某些专有代码的情况下尽可能地解释它。
更新 - 实体
分配实体
QuestionSheet 实体
网格实体
网格元素实体
问题实体
回答实体
更新 2AbstractElement
根据@Wilt 的回答
更新了实体。
NonUniformCollection
此更新在处理获取正确实体方面产生了一些问题。这曾经是基于$type
财产。
但是,不允许在具有符号$type
的实体中拥有属性。* @ORM\DiscriminatorColumn(name="type", type="string")
因此,所有使用鉴别器的类也都更新了以下内容。
唉,原来的问题依然存在。
sql - 在 INSERT INTO 期间使 Doctrine 跳过字段/列是只读的
我有一个 PostgreSQL 表,其中包含, , ...t
列。由于效率原因,我需要在通过 Doctrine 水合所有对象之前过滤实体集合。但是,Doctrine 的类太有限了,因为它必须工作在 PHP 对象级别(水化后)和 SQL 级别(水化后)。因此,我决定创建一个基本上反映表的 SQL 视图,并添加一个额外的动态列,用于在 SQL 级别评估表达式。因此我有t1
t2
Criteria
T
(注:上面的布尔表达式 forflag
实际上要复杂得多。它在此处用作占位符。)
Doctrine 实体T
链接到视图而不是表,并且有一个附加字段$flag
。我ORM\ChangeTrackingPolicy( "NOTIFY" )
在这个实体类上使用,使得该字段$flag
永远不会被标记为脏,并且 Doctrine 永远不会将它包含在UPDATE
语句中。在 PHP 级别,该字段$flag
与通过适当的 getter/setter 形成布尔表达式的字段保持同步。
如果视图的字段是同一个表的基本表达式,PosgreSQL 支持INSERT INTO
,UPDATE
和on 视图。DELETE
问题:如果一个新实体第一次被持久化,Doctrine 将该字段包含$flag
在INSERT INTO
语句中,即使$flag
被标记为不脏。这将触发以下 SQL 异常:“错误:无法插入视图“v”的列“标志”详细信息:不是其基本关系列的视图列不可更新。
有什么方法可以告诉 Doctrine 不包括此列?有没有办法将列标记为只读?
zend-framework2 - Zend 2 Hydrator 策略限制键
我今天一直在玩 Zend Hydrator 类,刚刚找到了用于即时转换输入键的命名策略。但是,当将 MapNamingStrategy 与 ObjectProperty 水合器一起使用时,如果输入数组包含它们,它似乎会添加最初不存在于对象中的属性。
有什么方法可以限制它添加新属性并且只填充/水合输入对象中的现有属性?
arrays - 如何从具有 ID 的数组创建模型集合 - Laravel
我正在创建一个带有按钮attach (name)' for each model which is not connected to the base model with a
belongsToMany` 关系的 foreach 循环。
我有一个带有特定模型 ID 的数组
然后我有同一个模型的所有模型实例,
我的问题:如何从$missing_stages
数组中获取集合
数组按预期创建
我的问题(替代解决方案)
我实际上想在这里得到的是一组模型,这些模型没有通过关系附加到主$object
模型stages()
。
该关系定义如下:
我无法使用此代码获得我想要的收藏:
注意:我试图删除关系定义中的枢轴部分,但没有帮助,该diff
方法对我不起作用。收藏中没有任何内容。
任何帮助表示赞赏。谢谢。
php - 具有空构造函数且不引用数据库的类的目的是什么
我怀疑这种问题已经被问过了,但我找不到任何关于它的东西。
每次我在一个新项目上工作时,我都会看到应该遵循关于 OOP、MVC 或其他任何东西的最后花哨规则的代码,但每次我看它时,在我看来,它甚至违反了他们吹嘘的概念的基本原理.
例如,在这里,我偶然发现了一个代表具有大约 60 个属性的“站”的类,但构造函数中唯一期望和设置的属性是 ID,并且此类无法访问可以从中获取的 DB使用身份证信息...
所以有60个setter,60个getter和一堆其他方法。这有什么意义,而不是在构造函数中接收一个包含所有信息的数组,或者一个 ID 和对 DB 的引用,这仍然会使信息源变得灵活。
是“补水”的东西吗?如果是,你能详细说明它的好处吗?至于现在,它只是让我更难调试和定位数据的来源。
谢谢大家的时间!
php - Silex 或 Symfony 中的 Hydrator 和命名策略
我正在寻找一些为Silex或Symfony配置许多不同策略映射字段的Hydrator或Factory Hydrator。
我有许多具有不同结构的维度数组,我想设置一些规则或映射并创建一个与我的类相同的对象(类似于实体模型的结构)。
我在Zend中找到了类似的东西:https ://framework.zend.com/manual/2.4/en/modules/zend.stdlib.hydrator.namingstrategy.mapnamingstrategy.html 。
也许有什么方法可以在Silex或Symfony中创建它?
android - 无法将水合数据插入 Google Fit
我正在尝试将水合数据插入 Google Fit。但我无法插入数据。
这是我的代码:
BuildFitnessClient:
插入和验证数据:
插入数据:
截至目前,我只尝试先上传数据。我已经评论了所有数据查询部分。
另外,当我第一次插入数据时,我得到了插入失败的状态,但是当我尝试再次插入时并没有发生这种情况。您可以在此处查看日志消息:
基本上,在第二次插入数据的请求之后,它似乎根本没有进入 insertFitnessData() 。
编辑 1:我意识到我不需要每次都调用 BuildFitness() 方法。所以它在 onCreate() 期间只被调用一次,正如您在日志消息中看到的那样,它显示“已连接”以适应服务。
现在我在按钮 onclick() 上触发 InsertandVerifyDataTask 异步任务,并且每次数据插入失败。
编辑 2我尝试插入他们的 github 页面中给出的步骤数据并且有效。但水合作用不是。
有人可以帮我吗?感谢:D
symfony - 带有连接的 Doctrine 查询构建器 - 水合物数组
我注意到最近在 symfony 3.3 下我没有真正遇到过的行为。
如果我使用带有一些连接的查询构建器,在我返回的结果集中,我最终会在结果数组中的新行上找到每个表 - 例如,如果我将 t1 和 t2 连接到 t3 上,其中每个表都是一个学说实体,我会得到一个看起来有点像这样的结果:
这 3 个数组项对应于构成结果集的单个连接“行”的每个实体/“表”。
我发现 HYDRATE_SCALAR 给了我一个更传统的“标量”(duh ..没有震惊)结果,其中结果数组的每个元素都包含一个完整的标量行..但是我没有得到很好的水合实体对象与:(
我想知道,有没有什么方法可以在不编写我自己的辅助方法的情况下本地使用 symfony / 学说,我可以获得一个结果数组,其中每个元素对应于结果集中的一行?也许上面每个实体对象都有键?
或者,除此之外,人们通常如何使用它?迭代这样一个结果集并将上面示例中的每组 3 个数组元素作为一个“行”处理是否“安全”?即,将数组分成 3 个,还是一次迭代 3 个?
这种行为真的让我很惊讶,而且看起来很不直观。这里的任何关于这背后的想法的教育也可能会有所帮助。
此外,当我使用 HYDRATE_ARRAY 时,这似乎不会水合我定义的任何 OneToOne、OneToMany 或 ManyToOne 关系中的相关实体。我希望一个包含我的相关实体属性的多维数组.. 一厢情愿,或者这可以实现(同样没有额外的辅助方法)
谢谢大家!
*编辑 - 我的例子中的错误
html - phonegap hydration 是否启用?
回家吧,如果在 phonegap 设置中启用了水合作用,我只能使用我的应用程序上网吗?
我以为是因为我没有密钥库,但我得到了,所以不是那样的。
我的应用程序能够上线非常重要,我不明白为什么需要启用水合作用。
doctrine - How to properly hydrate and extract Doctrine Entities from Zend Forms
I'm just starting out with Doctrine and was rewriting some code to use Doctrine entities in some Forms.
I have an Entity Business which has some 1:n relations with addresses, employees, emails etc. the Setup is really basic and working fine.
To add new Businesses i created a BusinessForm and Fieldsets for each of my entities. Here the constructor of the form:
addElements just adds a Submit and CSRF input.
And here the Controller action:
The form validates and i can get the Data from the form with $form->getData()
. But i cant figure out how to get a populated Object from the form using the form's hydrator. When I use setObject(new Business())
at the start of the controller i get an error while $form->isValid()
is running :
Isnt that the wrong hydrator being called ?
If i dont setObject()
but instead use $form->bind(new Business())
after the validation i get an empty Object from $form->getObject()
. If i get the data and hydrate a new Object with the form's hydrator like so : $form->getHydrator()->hydrate($data['business], new Business())
i do get the populated Object i was expecting. (Business being the name of the base fieldset)
So my question is, how to i get the result of the last call from just using $form->getObject()
after the validation?
[EDIT]
The Problem seems to be with the Collections of Fieldsets used as sub-fieldsets in the businessfieldset. If i validate the form without using the collections i do get the expected Business Object from $form->getData()
Here an example how i add the collection (in the business fieldset):
and here the EmailFieldset:
}
}
If using the Collections i get the Error message from above. So after adding a hydrator to each Fieldset i was fine.
Although i was under the impression that setting the hydrator for the form would result in the used fieldsets to inherit that hydrator.Or was this because of using the fieldsets as collections and not directly ?