Doctrine orm doctrine2生成月份的实体编号
我有一个发票实体,我想在其中生成给定月份内的后续编号。Doctrine orm doctrine2生成月份的实体编号,doctrine-orm,doctrine,entity,symfony4,Doctrine Orm,Doctrine,Entity,Symfony4,我有一个发票实体,我想在其中生成给定月份内的后续编号。 实体代码: /** * Class Invoice * @package App\Entity * @ORM\Entity() * @ORM\HasLifecycleCallbacks() */ class Invoice { (...) /** * @var int * @ORM\Column(type="integer") */ private $year; /**
实体代码:
/**
* Class Invoice
* @package App\Entity
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks()
*/
class Invoice
{
(...)
/**
* @var int
* @ORM\Column(type="integer")
*/
private $year;
/**
* @var int
* @ORM\Column(type="integer")
*/
private $month;
/**
* @var int
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class="App\Helper\InvoiceNumberGenerator")
*/
private $counter;
(...)
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function numberGenerator()
{
if ($this->getYear() === null) {
$this->setYear(date('Y'));
$this->setMonth(date('m'));
}
}
App\Helper\InvoiceNumberGenerator代码为:
<?php
namespace App\Helper;
use App\Entity\Invoice;
use Doctrine\Common\Persistence\ObjectRepository;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Exception;
class InvoiceNumberGenerator extends AbstractIdGenerator
{
/**
* Generates an invoice number
*
* @param EntityManager $em
* @param Invoice $entity
* @return mixed
* @throws Exception
*/
public function generate(EntityManager $em, $entity)
{
if (!$entity instanceof Invoice) {
throw new Exception('Generator służy tylko do generowania numerów faktur.');
}
/** @var ObjectRepository | EntityRepository $invoiceRepository */
$invoiceRepository = $em->getRepository(Invoice::class);
/** @var Invoice $lastInvoice */
$lastInvoice = $invoiceRepository->findOneBy(
array(
'year' => $entity->getYear(),
'month' => $entity->getMonth()
),
array(
'counter' => 'desc'
)
);
if (empty($lastInvoice)) {
return 1;
}
return $lastInvoice->getCounter() + 1;
}
}
看起来生成器正确地选择了最后一个,但我在尝试创建新发票时出错:
SQLSTATE[23000]:完整性约束冲突:1048列“计数器”
不能为空
关于我做错了什么有什么建议吗?只有当列也标记有
@Id
时才会调用@CustomIdGenerator
注释。从:
此注释允许您指定用户提供的类以生成标识符。此注释仅在同时指定@Id和@GeneratedValue(strategy=“CUSTOM”)时有效
ID总是一种特殊的东西,因此有时在插入之前必须是完美的。为了解决您的问题—因为计数器不是id列—您可以改用(可能是prePersist)并在事件侦听器/订阅服务器中使用来运行查询。只有当列也标记有
@id
时才会调用@CustomIdGenerator
注释。从:
此注释允许您指定用户提供的类以生成标识符。此注释仅在同时指定@Id和@GeneratedValue(strategy=“CUSTOM”)时有效
ID总是一种特殊的东西,因此有时在插入之前必须是完美的。为了解决您的问题—因为计数器不是id列—您可以改为使用(可能是prePersist)并在事件侦听器/订阅服务器中使用来运行查询。我没有发现它只适用于@id字段。你是对的,我应该在prePersist上使用事件订阅服务器,但同时我发现我需要在generated设置为true之后生成数字,所以完全重建了所有这些。谢谢你。我不明白它只适用于@Id字段。你是对的,我应该在prePersist上使用事件订阅服务器,但同时我发现我需要在generated设置为true之后生成数字,所以完全重建了所有这些。谢谢你。
Invoice {#5522 ▼
-id: 1
-generated: false
-fileName: "example"
-year: 2019
-month: 11
-counter: 1
-name: "AG"
-company: "Gall"
-address: "Street 1"
-address2: "Gliwice"
-nip: "6314567890"
-reservation: Reservation {#5855 ▶}
-date: null
}