2016-11-28 99 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,但它並不真正有意義兩次存儲相同的信息

相關問題