Mongodb: избегайте дублирования значений полей - PullRequest
0 голосов
/ 20 мая 2019

Я использую 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 в таблицу счетов, если я создаю два счета одновременно, то происходит дублирование номера счета, как я могу избежать этого дублирования?Пожалуйста, помогите мне.ниже указан мой код

1 Ответ

1 голос
/ 20 мая 2019

Вы можете решить эту проблему, добавив декоратор @MongoDB \ Index (unique = true) в поле billNo.

В документе Счета 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.
}
...