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
}