2016-11-28 102 views
0

我有一个简单的文件,有ID:如何在同一文档的另一个属性中创建一个属性?

/** 
    * @MongoDB\Id(strategy="increment") 
    * @Serializer\Since("2.0") 
    */ 
    protected $id; 

和财产代码

/** 
* @var string 
* 
*/ 
protected $code; 

我想的是,基于代码的ID生成。所以我打算在构造

public function __construct() 
{ 
$this->code = (string)$this->id.(string)rand(0,1000); 
} 

我的问题是定义它,因为二者都是在同一个PHP类定义,就不会有任何风险定义基于在另一个呢?

任何风险的代码要求id它之前定义?或者有更好的方法来做这样的事情?

+0

是否正确,你不想保存在数据库中的代码属性,并只有序列化的对象? –

回答

0

创建对象时,您的ID将为空。要创建代码属性,您应该在保留后设置它。事情是这样的:

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 

$item = new Item(); 
$item->setSomeValue($someValue); 
$dm->persist($item); 
$dm->flush(); 

$item->setCode($item->getId()); 
$dm->persist($item); 
$dm->flush(); 

你可以想像,这不是一个很好的做法,你应该避免它。 从数据库ID生成值,这也不是一个好主意。我建议你使用像uniqid这样的功能来解决这个问题。 Uniqid更安全,更快,更清洁。

+1

尽管我同意最好生成自己的ID,但我不建议使用uniqid()。更好的选择是UUID,它可以很容易地由像ramsey/uuid这样的库生成。 – Gerry

+0

我使用了这个相关问题中描述的函数gen_uuid()http://stackoverflow.com/questions/307486/short-unique-id-in-php/307773 –

0

如果你只是想序列化的obj是这样的:

{ 
id:123, 
code:123 
} 

ü可以只添加一个getter函数,它会被包含在序列化的结果

/** 
* @var string 
* 
*/ 
protected $code; 

public function getCode(){ 
    return $this->getId(); 
} 

如果这不automagicaly工作(应该)您可以使用批注序列化程序:

/** 
* @JMS\Expose 
* @JMS\Accessor(getter="getCode") 
*/ 
private $code; 

如果要保留代码属性你可以做它像Vangoso,但它并不真正有意义两次存储相同的信息

相关问题