2012-12-07 43 views
0

在Doctrine2实体中可以有一个db字段的几个表示?Doctrine2:来自一个db字段的几个对象属性

现场示例: 我在数据库字段中加密了对象。我创建了特殊的数据类型以便即时解密该字段。现在我需要在从db中选择后在实体中具有加密和解密值。

我试图解决这个问题是这样的:

/** 
* @var array 
* @ORM\Column(type="EncryptedData", name="data") 
*/ 
private $data; 

/** 
* @var string 
* @ORM\Column(type="text", name="data") 
*/ 
private $encryptedData; 

但学说产生约重复字段错误。

+0

什么@ nikita2206建议似乎非常像你想要的。也许你可以使用[LifecycleEvents] [1]来加密/解密除此之外的数据,只需要加密数据的属性,该数据将被保留,另一个类属性用于未加密/解密的数据,可通过getter/setter和哪些不会被存储在数据库中。 [1]:http://symfony.com/doc/cookbook/doctrine/event_listeners_subscribers.html – dbrumann

回答

2

但是在数据库中应该是一个字段? 你需要的东西是这样的:

/** 
* @var array 
* @ORM\Column(type="EncryptedData", name="data") 
*/ 
private $data; 

private $encryptedData; 

public function getData() 
{ 
    return $this->data; 
} 

public function getEncryptedData() 
{ 
    if ($this->encryptedData === null) { 
     // do with that data whatever you need 
     $this->encryptedData = processSomehow($this->data); 
    } 

    return $this->encryptedData; 
} 
+0

'type =“EncryptedData”'不是一个有效的Doctrine类型,我认为你的意思是把注释放在' $ encryptedData'。 – dbrumann

+0

他创建的类型 – nikita2206

+0

是的,我注意到,当我直接评论这个问题时,但到那时编辑此评论为时已晚。抱歉。 – dbrumann

0

你所得到的重复的字段错误,因为这两个领域被称为“数据”,在您的注释。如果你想在你的数据库表中的字段都尝试这样的事:

/** 
* @var array 
* @ORM\Column(type="text", name="data") 
*/ 
private $data; 

/** 
* @var string 
* @ORM\Column(type="text", name="encrypteddata") 
*/ 
private $encryptedData; 

这就是说,在你的数据库中存储的敏感数据加密是不是一个好主意安全明智的。

希望它有帮助。

+0

感谢您的回复。但是我有DB中唯一一个存储加密数据的列。 – Ostin

+0

在这种情况下,请尝试使用nikita2206的解决方案。它应该适合你。 –

相关问题