我如何映射这种关系?

时间:2013-12-24 16:40:22

标签: symfony doctrine

我无法在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,但是没有达到预期的效果。我明白了,“在映射的超类上设置反向一对多或多对多关联”是错误的。另外,从文档中我不认为这是正确的方法。

我在绕着它缠绕我的大脑时遇到了麻烦。有什么想法吗?我希望我解释得那么好......

1 个答案:

答案 0 :(得分:0)

你有一个比Doctrine更基础的问题。您想要在数据库中显示继承。对于这种方法,没有真正正确的解决方案。您可以创建一个扩展UseCase的Entity TestCase,并使用与TestCaseStep的另一种关系覆盖相应的属性(需要使它们受到保护)。

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

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

另一种方法肯定是只使用此实体使用的子实体中的属性,并分别在TestCase和UseCase或TestCaseStep和UseCaseStep之间创建另一种关系(多对一)。但是后一种方法并不容易,如果你对Doctrine,Symfony和数据库一般都没有很多知识,那么最终会变得非常复杂。