Value对象关联可能吗?

时间:2017-02-02 13:31:18

标签: doctrine-orm

我想知道是否有可能在实体和价值对象之间建立关系,或者第三个实体是否必须作为关系目标。目的可能是使用具有自己业务逻辑的公共数据结构标记不同类型的实体。有什么想法吗?

更新:

假设我有一个业务对象来模拟SCAP CPE命名:

$(document).ready(function(){
    if(isEDGE()) {
        $('a').attr('download','download');
    } else {
        $('a').attr('target','_blank');
    }
})

如果我想以一对多的方式用这个VO标记不同类型的实体,我可以想到两种不同的方式:

  • 实体与VO直接相关,因此关系标识符可以是实体引用和VO本身(=由引用的标识符和代表性VO字段组成的键)
  • 实体与第三实体类型相关,它们嵌入VO以使关系标识符成为第三个实体标识符

所以我想知道是否只有第二个选项可用,或者第一个选项是否可以某种方式实现。

1 个答案:

答案 0 :(得分:2)

你应该使用custom mapping type来做这样的事情。例如,它看起来像这样:

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform

class Cpe22Type extends Type
{
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return $platform->getVarcharTypeDeclarationSQL(array('length' => 250));
    }

    public function convertToPHPVale($value, AbstractPlatform $platform)
    {
        return new Cpe22($value);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return (string) $value;
    }

    public function getName()
    {
        return 'cpe22';
    }

    public function requiresSQLCommentHint(AbstractPlatform $platform)
    {
        return true;
    }
}

显然,您必须在__toString()课程中添加Cpe22方法才能实现此目的。

在注册类型后(如何执行此操作取决于您的框架,例如在{emmony} {}}),您只需将字段映射为cpe22类型:

/**
 * @ORM\Column(name="my_cpe", type="cpe22")
 */
public $myCpe;