我有一个简单的文档,其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将为null。要创建代码属性,您应该在persist之后设置它。像这样:
$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 :(得分:0)
如果你只想让序列化的obj像:
{
id:123,
code:123
}
你可以添加一个getter函数,它将包含在序列化结果中
/**
* @var string
*
*/
protected $code;
public function getCode(){
return $this->getId();
}
如果这不能自动执行(应该),您可以使用序列化器的注释:
/**
* @JMS\Expose
* @JMS\Accessor(getter="getCode")
*/
private $code;
如果你想保留代码属性,你可以像Vangoso那样做,但是两次存储相同的信息并不是很有意义