我无法在Doctrine中映射这种关系。我有一个UseCase,它有许多UseCaseSteps。 UseCaseStep有许多子步骤,它们是UseCaseStep上的OneToMany。这是我有的相关代码:
/**
* UseCase
*
* @ORM\Table(name="use_cases")
* @ORM\Entity(repositoryClass="DesignCase\Bundle\Bundle\Entity\UseCaseRepository")
*/
class UseCase
{
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Actor", inversedBy="use_cases", cascade={"persist", "remove"})
* @ORM\JoinTable(name="actors_use_cases")
*/
private $actors;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="UseCaseStep", mappedBy="useCase", cascade={"persist", "remove"})
* @ORM\OrderBy({"order" = "ASC"})
*/
private $steps;
}
/**
* UseCaseStep
*
* @ORM\Table(name="use_case_steps")
* @ORM\Entity(repositoryClass="DesignCase\Bundle\Bundle\Entity\UseCaseStepRepository")
*/
class UseCaseStep
{
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="UseCase")
*/
private $useCase;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="UseCaseStep", mappedBy="parent", cascade={"persist", "remove"})
* @ORM\OrderBy({"order" = "ASC"})
*/
private $subSteps;
/**
* @var UseCase
*
* @ORM\ManyToOne(targetEntity="UseCase")
*/
private $useCaseReference;
/**
* @var UseCaseStep
*
* @ORM\ManyToOne(targetEntity="UseCaseStep")
* @ORM\JoinColumn(nullable=true)
*/
private $parent;
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="BusinessRule", cascade={"persist", "remove"})
*/
private $businessRules;
}
该代码不完整,但我认为它具有所有相关信息。我想要做的是创建一个新实体TestCase,它有许多TestCaseSteps。 TestCase是一个具有更多信息的UseCase ......与TestCaseStep和UseCaseStep相同。 IE,一个TestCaseStep是一个UseCaseStep,它添加了数据输入和预期输出字段。用户可以从一个UseCase创建许多TestCase。
我尝试制作UseCase和UseCaseStep @MappedSuperclass,但是没有达到预期的效果。我明白了,“在映射的超类上设置反向一对多或多对多关联”是错误的。另外,从文档中我不认为这是正确的方法。
我在绕着它缠绕我的大脑时遇到了麻烦。有什么想法吗?我希望我解释得那么好......
答案 0 :(得分:0)
你有一个比Doctrine更基础的问题。您想要在数据库中显示继承。对于这种方法,没有真正正确的解决方案。您可以创建一个扩展UseCase的Entity TestCase,并使用与TestCaseStep的另一种关系覆盖相应的属性(需要使它们受到保护)。
您使用UseCaseStep和TestCaseStep执行类似操作。这样你就可以在实体中继承。现在,您必须确保使用另一个表,并最终在数据库方面使用完全独立的实体。它们只是在实体中共享相同的属性,但在数据库中是分开的。
在我看来,这种方法是最容易遵循的方法。其他所有内容似乎都非常复杂,因为您无法正确使用每个实体具有不同数量属性的表。每个数据库表都有一组固定的属性,需要在实体中反映出来。
另一种方法肯定是只使用此实体使用的子实体中的属性,并分别在TestCase和UseCase或TestCaseStep和UseCaseStep之间创建另一种关系(多对一)。但是后一种方法并不容易,如果你对Doctrine,Symfony和数据库一般都没有很多知识,那么最终会变得非常复杂。