【问题标题】:How to handle different entity types?如何处理不同的实体类型?
【发布时间】:2014-07-14 11:36:01
【问题描述】:

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

我想知道是否应该创建一个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 实体抽象,然后从中扩展SomeTypeApproval 和SomeOtherTypeApproval。对我来说,这似乎是一个更 OOP 的解决方案,但正如问题所暗示的那样,我有点不确定。

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

【问题讨论】:

标签: oop symfony inheritance doctrine-orm entity


【解决方案1】:

我会说为基本相同的事物创建不同类型的实体有点矫枉过正。

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

我刚刚创建了另一个实体“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 和“保持简单”的完美结合

【讨论】:

    【解决方案2】:

    为了区分类型,我沿用了面向对象的路径。我介绍了一个具有所有共享字段的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
    {
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 2010-10-07
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多