Efo*_*fog 1 php symfony doctrine-orm
我有以下代码:
$em = $this->getDoctrine()->getManager();
$evaluation->getQuestions()->clear();
foreach ($questions_data as $data) {
$id = (int) $data['id'];
if ($id > 0) {
$question = $em->getRepository('MyBundle:Question')->find($id);
if ($question)
$evaluation->getQuestions()->add($question);
}
}
$em->persist($evaluation);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
这是$questions_data- array(['id' => 2], ['id' => 1], ['id' => 3]).
以下是教义如何将问题持久化到数据库:

那么,如何让学说不排序问题呢?
Evaluation实体ManyToMany与实体有关系Question,所以ORDER BY无法帮助,因为表evaluations_questions是由Doctrine字段自动创建的,没有字段id.
当您在Doctrine中刷新新持久化的项目时,Doctrine必须使用内部函数确定将它们提交到数据库的顺序getCommitOrder.该函数的目的是确保在提交对象之前提交对象的依赖项.这样做是为了符合可能设置的任何外键约束.正如您所观察到的那样,将数据排序为这样的结果是您失去了精确调整项目提交顺序的能力 - 这不一定是坏事.
在SQL中,您可以通过发出查询来获得结果的唯一方法ORDER BY.如果您选择不指定排序方法,则不能指望结果以任何特定顺序返回.在PostgreSQL的文档解释了这一点:
如果未选择排序,则将以未指定的顺序返回行.在这种情况下,实际的顺序将取决于扫描和连接计划类型以及磁盘上的顺序,但不能依赖它.
换句话说,内容在数据库中的存储顺序无关紧要.
在您的问题中,问题对用户的显示顺序是个问题.您不能允许问题在评估中随机出现 - 它们必须遵循预设的顺序.Frankbeen对这个倒是一个评论,但最好的解决办法是添加在一个新的领域Evaluation,其存储阵列的Questions正确的顺序.然后,当您向用户提供评估时,可以读取订单.
如果您绝对必须按照数据库中的特定顺序对它们进行排序,那么您应该能够在持久化时单独刷新新对象,而不是将它们安排为一起刷新.
$em = $this->getDoctrine()->getManager();
$evaluation->getQuestions()->clear();
foreach ($questions_data as $data) {
$id = (int) $data['id'];
if ($id > 0) {
$question = $em->getRepository('MyBundle:Question')->find($id);
if ($question) {
$evaluation->getQuestions()->add($question);
$em->persist($evaluation);
$em->flush();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这将花费更多的时间来完成,并且对您的问题来说是一个非常糟糕的解决方案.
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |