【问题标题】:How to create one property based in another property of the same document?如何基于同一文档的另一个属性创建一个属性?
【发布时间】:2017-04-12 03:04:03
【问题描述】:

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

【问题讨论】:

  • 您不想将代码属性保存在数据库中并且仅用于序列化对象是否正确?

标签: php mongodb symfony constructor properties


【解决方案1】:

如果你只是希望序列化的 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 那样做,但是将相同的信息存储两次并没有意义

【讨论】:

    【解决方案2】:

    创建对象时,您的 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 更安全、更快、更清洁。

    【讨论】:

    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2019-11-11
    • 2014-04-19
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多