Mongodb:避免字段值重复

时间:2019-05-20 06:12:47

标签: php mongodb symfony symfony4 odm

我正在使用symfony ODM,我有两个表,一个用于保存帐单,另一个用于保存最后的帐单号。

Bills
id|bill_no |created_at
--|-------------------
1 |b2018/01|ISODate("2019-03-18T22:05:17.000+05:30")
--|-------------------
2 |b2018/01|ISODate("2019-03-18T22:05:17.000+05:30")
--|-------------------
3 |b2018/02|ISODate("2019-03-18T23:06:12.000+05:30")


Last_Bill
id|last_bill_no|key  |last_updated_at
--|-------------------
1 |2           |BILL |ISODate("2019-03-18T23:06:12.000+05:30")

基于Last_Bill表,我将bill_no保存到bills表,如果我同时创建两个票据,则票据号重复发生,如何避免这种重复呢?请帮我。我的代码在下面给出

$dm = $this->get('doctrine_mongodb')->getManager();
$lastBill = $dm->getRepository('AppBundle:LastBill')->findOneByKey('BILL');
$billNo = b.''.date('Y').'/'.($lastBill->getLastBillNo()+1);
$bill = new Bills();
$bill->setBillNo($billNo)
$dm->persist($bill);
$lastBill->setLastBillNo($lastBill->getLastBillNo()+1);
$dm->flush();

在“票据”文档中,票据编号定义为

/**
 * @MongoDB\Field(name="bill_no", type="string")
 */
protected $billNo;

1 个答案:

答案 0 :(得分:1)

您可以通过将@MongoDB \ Index(unique = true)装饰器添加到billNo字段来解决此问题。

在帐单凭证中,帐单编号将定义为

/**
 * @MongoDB\Field(name="bill_no", type="string")
 * @MongoDB\Index(unique=true)
 */
protected $billNo;

在您的控制器中,应该使用sureIndexes()函数来确保索引的创建,并且应该将代码包装在try ... catch中,以防止在保存两个具有相同billNo的实体时出现重复索引异常。

您的控制器将与此类似:

$dm = $this->get('doctrine_mongodb')->getManager();
$dm->getSchemaManager()->ensureIndexes();

$lastBill = $dm->getRepository('AppBundle:LastBill')->findOneByKey('BILL');
$billNo = b.''.date('Y').'/'.($lastBill->getLastBillNo()+1);
$bill = new Bills();
$bill->setBillNo($billNo)
$dm->persist($bill);
$lastBill->setLastBillNo($lastBill->getLastBillNo()+1);

try
{
   $dm->flush();
} catch (\Exception $e) {
// write some code here based what you want.
}