我想知道如何处理我需要不同类型实体的用例。就我而言,我想创建一个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
实体摘要,然后从中扩展SomeTypeApproval
和SomeOtherTypeApproval
。这对我来说似乎是一个更为OOP的解决方案,但正如问题所暗示的那样,我有点不确定。
所以我想知道每种方法的优缺点是什么,以决定我应该遵循哪条路线。
答案 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
{
}
我使用单表继承,因为不同的类型共享相同的字段,这不太可能会发生很大变化。然而,即使一种类型要获得额外的字段,我也可以单独在其实体类中定义它们而不会污染其他类型。 (在数据库方面,所有类型都将具有相同的字段,那些未定义的字段将被取消)。
我更喜欢这种方法,因为当我将它们添加到实体时可以键入提示,或者可以轻松地将侦听器附加到它们而无需手动检查某些字段。