如何处理不同的实体类型?

时间:2014-07-14 11:36:02

标签: oop symfony inheritance doctrine-orm entity

我想知道如何处理我需要不同类型实体的用例。就我而言,我想创建一个Approval-Entity。然而,我必须分辨出不同类型的批准。

我想知道我是否应该创建一个type字段,然后通过我也存储在数据库中的类型常量来处理不同的类型,例如:

use Doctrine\ORM\Mapping as ORM;

/**
 * Approval
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Hn\AssetDbBundle\Entity\ApprovalRepository")
 */
class Approval
{
    const SOME_TYPE = 1;
    const SOME_OTHER_TYPE = 2;

    /**
     * @var integer
     * @ORM\Column(name="type", type="integer")
     */

    private $type;
}

另一种方法是让我的Approval实体摘要,然后从中扩展SomeTypeApprovalSomeOtherTypeApproval。这对我来说似乎是一个更为OOP的解决方案,但正如问题所暗示的那样,我有点不确定。

所以我想知道每种方法的优缺点是什么,以决定我应该遵循哪条路线。

2 个答案:

答案 0 :(得分:0)

我会说,为基本相同的事情创建不同类型的实体有点过分。

我有类似的东西,我需要一种方法告诉实体它是哪种实体。

我刚刚创建了另一个实体" EntityType",其中我将所有类型存储在数据库中,只是使用类型的ID扩展了实体。

所以你的2个实体将是

use Doctrine\ORM\Mapping as ORM;

/**
 * Approval
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Hn\AssetDbBundle\Entity\ApprovalRepository")
 */
class Approval
{

    /**
     * @var integer
     * ManyToOne Relation to "ApprovalType"
     */

    private $type;
}

ApprovalType

/**
 * ApprovalType
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Hn\AssetDbBundle\Entity\ApprovalTypeRepository")
 */
class ApprovalType
{
    //Here you can define the type
    private $name;

    //OneToMany Relationship to the Approvals
    private $approvals;
}

完美地为我工作,我认为它很好地适应了案例,是OOP和&#34的完美组合;保持简单"

答案 1 :(得分:0)

为了区分类型,我跟进了面向对象的路径。我介绍了一个BaseApproval类,其中包含所有共享字段:

<?php

namespace My\Bundle\\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContextInterface;

/**
 * @ORM\Entity

 * @ORM\Table()
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 *      "someType" = "My\Bundle\Entity\Approvals\SomeTypeApproval",
 *      "someOtherType" = "My\Bundle\Entity\Approvals\SomeOtherTypeApproval",
 *      "yetAnotherType" = "My\Bundle\Entity\Approvals\YetAnotherTypeApproval"
 * })
 */

abstract class BaseApproval
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="textField", type="text", nullable=true)
     */
    private $textField;

    ...
}

在我的情况下,类型只是一些基本类,因为没有特定于类型的字段:

<?php
namespace My\Bundle\Entity\Approvals;

use Doctrine\ORM\Mapping as ORM;
use My\Bundle\Entity\BaseApproval;

/**
 * @ORM\Entity
 */
class SomeTypeApproval extends BaseApproval
{
}

我使用单表继承,因为不同的类型共享相同的字段,这不太可能会发生很大变化。然而,即使一种类型要获得额外的字段,我也可以单独在其实体类中定义它们而不会污染其他类型。 (在数据库方面,所有类型都将具有相同的字段,那些未定义的字段将被取消)。

我更喜欢这种方法,因为当我将它们添加到实体时可以键入提示,或者可以轻松地将侦听器附加到它们而无需手动检查某些字段。