编辑 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实体。它也可能是Textor Image,这是基于type = questiona的属性Discriminator。
水合数据后,我们得到以下实体结构:
如您所见,水合后数据不再正确。这是在$form->isValid(). QuestionSheet 1包含第一个QuestionforQuestionSheet 2并且Question具有第二个Answer的第三个Question中的第一个QuestionSheet。
在阅读完整的水合数据集时,我看到Answers为第一个创建的数据集QuestionSheet已被删除。第二Answers个QuestionSheet已被复制并覆盖了第一个问题表中的答案。本质上,您在上图中看到的内容。
更糟糕的是
以下是上述之后保存到数据库中的所有数据,上面提到的场景是2个列表,5个问题和9个答案。
所以第一个问题,没有问答。第二个 QuestionSheet 的问题已用于覆盖它们。此外,只有最后 2 个答案在那里,填补了应该是 9 的空间!。
顺便说一句,返回 this 的查询完全LEFT JOIN是为了显示所有空数据,仅此而已。
似乎它抓住了最后一组任何子实体来填充以前的实体或其他东西。我迷路了。
这怎么可能?
正如我所提到的,我已经做了很长时间,但找不到解决方案。希望大家能帮忙。
如果您需要有关代码的任何信息,我会尽力在此处显示或在某些专有代码的情况下尽可能地解释它。
更新 - 实体
分配实体
/**
* @ORM\Entity(repositoryClass="Wms\Admin\Assignment\Repository\AssignmentRepository" )
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="ass_assignment")
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
*/
class Assignment extends SeoUrl
{
//Traits and properties
/**
* @ORM\OneToMany(targetEntity="Wms\Admin\Assignment\Entity\QuestionSheet", mappedBy="assignment", cascade={"persist", "remove"}, orphanRemoval=true)
**/
protected $questionSheets;
public function __construct()
{
$this->abstractEntity_entityCategories = new ArrayCollection();
$this->questionSheets = new ArrayCollection();
$this->documents = new ArrayCollection();
}
public function __toString()
{
return (string)$this->id;
}
//More getters/setters
}
QuestionSheet 实体
/**
* @ORM\Entity(repositoryClass="Wms\Admin\Assignment\Repository\QuestionSheetRepository")
* @ORM\Table(name="ass_questionsheet")
**/
class QuestionSheet extends AbstractEntity
{
/**
* @ORM\ManyToOne(targetEntity="Wms\Admin\Assignment\Entity\Assignment", inversedBy="questionSheets")
* @ORM\JoinColumn(name="assignment_id", referencedColumnName="id", onDelete="CASCADE")
**/
protected $assignment;
/**
* @ORM\OneToOne(targetEntity="Wms\Admin\LayoutGrid\Entity\Grid", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="grid_id", referencedColumnName="id")
**/
protected $grid;
public function __construct()
{
$this->gridElements = new ArrayCollection();
}
//More getters/setters
}
网格实体
/**
* @ORM\Entity
* @ORM\Table(name="lg_grid")
**/
class Grid extends AbstractEntity
{
/**
* @ORM\OneToMany(targetEntity="Wms\Admin\LayoutGrid\Entity\Element\AbstractElement", mappedBy="grid", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\OrderBy({"y" = "ASC", "x" = "ASC"})
*/
protected $gridElements;
public function __construct()
{
$this->gridElements = new ArrayCollection();
}
}
网格元素实体
/**
* @ORM\Table(name="lg_grid_element")
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\HasLifecycleCallbacks
**/
class AbstractElement extends AbstractEntity implements GridElementInterface
{
/**
* @ORM\ManyToOne(targetEntity="Wms\Admin\LayoutGrid\Entity\Grid", inversedBy="gridElements")
* @ORM\JoinColumn(name="grid_id", referencedColumnName="id", onDelete="CASCADE")
**/
protected $grid;
public $type = ''; //This is a discriminator
}
问题实体
/**
* @ORM\Entity
* @ORM\Table(name="lg_grid_question")
**/
class Question extends AbstractElement
{
/**
* @ORM\OneToMany(targetEntity="Wms\Admin\LayoutGrid\Entity\Element\Answer", mappedBy="question", cascade={"persist"})
*/
protected $answers;
public $type = 'question'; //Inherited property, now filled in with discriminator value
public function __construct()
{
$this->answers = new ArrayCollection();
}
}
回答实体
/**
* @ORM\Entity
* @ORM\Table(name="lg_grid_answer")
**/
class Answer extends AbstractEntity
{
/**
* @ORM\ManyToOne(targetEntity="Wms\Admin\LayoutGrid\Entity\Element\Question", inversedBy="answers", cascade={"persist"})
* @ORM\JoinColumn(name="question_id", referencedColumnName="id", onDelete="CASCADE")
**/
protected $question;
public function __toSting() {
return (string) $this->getId();
}
}
更新 2AbstractElement根据@Wilt 的回答
更新了实体。
/**
* @ORM\Table(name="lg_grid_element")
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\HasLifecycleCallbacks
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({
* "abstractElement"="AbstractElement",
* "question"="Question",
* //Others
* })
**/
class AbstractElement extends AbstractEntity implements GridElementInterface
{
//Same as above
}
NonUniformCollection此更新在处理获取正确实体方面产生了一些问题。这曾经是基于$type财产。
但是,不允许在具有符号$type的实体中拥有属性。* @ORM\DiscriminatorColumn(name="type", type="string")因此,所有使用鉴别器的类也都更新了以下内容。
const ELEMENT_TYPE = 'question'; //Overwritten from AbstractElement
/**
* @return string
*/
public function getType() //Overwritten from AbstractElement
{
return self::ELEMENT_TYPE;
}
唉,原来的问题依然存在。


