Symfony 我如何映射这种关系?

Symfony 我如何映射这种关系?,symfony,doctrine,Symfony,Doctrine,我很难在条令中描述这种关系。我有一个用例,它有许多用例步骤。UseCaseStep有许多子步骤,它们是UseCaseStep上的一个子步骤。这是我的相关代码: /** * UseCase * * @ORM\Table(name="use_cases") * @ORM\Entity(repositoryClass="DesignCase\Bundle\Bundle\Entity\UseCaseRepository") */ class UseCase { /** *

我很难在条令中描述这种关系。我有一个用例,它有许多用例步骤。UseCaseStep有许多子步骤,它们是UseCaseStep上的一个子步骤。这是我的相关代码:

/**
 * 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。测试用例是一个包含更多信息的用例。。。TestCaseStep和UseCaseStep也一样。也就是说,TestCaseStep是一个UseCaseStep,其中添加了数据输入和预期输出字段。用户可以从一个用例创建多个测试用例

我试着制作UseCase和UseCaseStep@MappedSuperclass,但没有达到预期效果。我得到一个明显的结论,在映射的超类错误上设置反向的一对多或多对多关联是非法的。另外,从文件来看,我认为这无论如何都不是正确的方法


我很难用脑子来思考这个问题。有什么想法吗?我希望我解释得足够好…

你有一个比教义更基本的问题。您希望在数据库中显示继承。对于这种方法,没有真正正确的解决方案。您可以创建一个实体TestCase,该实体扩展UseCase并覆盖相应的属性,这些属性需要使用与TestCaseStep的另一个关系来保护它们

您可以使用UseCaseStep和TestCaseStep执行类似的操作。这样,您就可以在实体中继承。现在,您必须确保使用另一个表,并且最终在数据库中使用完全独立的实体。它们只是在实体中共享相同的属性,但在数据库中是分开的

我认为这是最容易遵循的方法。其他一切似乎都非常复杂,因为您无法正确地使用一个表,每个实体的属性数量不同。每个数据库表都有一组需要反映在实体中的固定属性


另一种方法肯定是只使用该实体使用的子实体中的属性,并分别在TestCase和UseCase或TestCaseStep和UseCaseStep之间创建另一种多对一关系。但后一种方法并不容易,如果你对教义、符号和数据库没有太多的了解,那么最终可能会变得非常复杂。

多亏了深思熟虑的答案。我采用后一种方法。正如你所说,有些地方很棘手,但效果很好。