如何基于同一文档的另一个属性创建一个属性?

时间:2016-11-28 11:43:21

标签: php mongodb symfony constructor properties

我有一个简单的文档,其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 的风险?或者有更好的方法来做这样的事情?

2 个答案:

答案 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那样做,但是两次存储相同的信息并不是很有意义