如何在插入db之前使自动递增的值显示出来

问题描述

因此,我想在将id值(AI)插入到db中之前从用户进行检查和确认的情况下显示它。我需要显示InvoiceId,它是与第一张表的ID相关的外键。当我使用getId()方法时,我得到的是null值。基本地,我希望InvoiceId不为null。还是让用户插入InvoiceId,但不会与第一张表的ID相关。

我收到此消息:

在使用参数[null,“ 111”,111 ,111,1,111]: sqlSTATE [23000]:违反完整性约束:1048列'InvoiceId'不能为空

我没有为id设置方法,可以用其他方法完成。 例如我从表中获得了最后插入的ID,然后将其递增1?

"name","data"
"Play","http://{gho}.domain.com/"
"BDomain","domain.com"
"Charts","2"
"Compress","0"
"CompressJ","0"

一个问题:我正确地做了这个外键吗?

class InvoiceController extends Controller
{
    /**
     * @Route("/",name="invoice")
     * @param Request $request
     * @return Response|null
     */
    public function invoiceAction(Request $request)
    {

        $invoiceHeaderForm = $this->createForm(\InvoiceFormType::class);
        $invoiceBodyForm = $this->createForm(\InvoiceRowsFormType::class);
        $invoiceHeaderForm->handleRequest($request);
        $invoiceBodyForm->handleRequest($request);
        //var_dump($invoiceBodyForm);

        if ($invoiceHeaderForm->isSubmitted() && $invoiceHeaderForm->isValid()){
               // && $invoiceBodyForm->isSubmitted() && $invoiceBodyForm->isValid()){
            /*
             * Get the data from the form
             */
            $dataHeader = $invoiceHeaderForm->getData();
            $dataBody = $invoiceBodyForm->getData();
            $invoice = new Invoice();
            $invoiceBody = new InvoiceBody();

            // Set the data from the form to the $invoice
            $invoice->setClientId($dataHeader['clientId']);
            $invoice->setInvoiceDate($dataHeader['invoiceDate']);
            $invoice->setInvoiceNumber($dataHeader['invoiceNumber']);
            // Set the data form the body form to the $invoiceBody
            $invoiceBody->setInvoiceId($dataBody['invoiceId']);
            $invoiceBody->setDescription($dataBody['description']);
            $invoiceBody->setQuantity($dataBody['quantity']);
            $invoiceBody->setAmount($dataBody['amount']);
            $invoiceBody->setVAT($dataBody['VAT']);
            $invoiceBody->setTotalWithVAT($dataBody['totalWithVAT']);

            // Send the data to the next page with session
            $this->get('session')->set('invoice',$invoice);
            $this->get('session')->set('invoiceBody',$invoiceBody);

             return $this->redirectToRoute('invoice_confirm');
 
        }
        
        return $this->render('invoice/invoice.html.twig',[
            'invoiceHeaderForm' => $invoiceHeaderForm->createView(),'invoiceBodyForm' => $invoiceBodyForm->createView()
        ]);
    }

    /**
     * @Route("/invoice-confirm",name="invoice_confirm")
     * @param Request $request
     * @param EntityManagerInterface $em
     * @return RedirectResponse|Response|null
     */
    public function invoiceActionConfirm(Request $request,EntityManagerInterface $em){

        $confirmForm = $this->createForm(ConfirmFormType::class);
        $confirmForm->handleRequest($request);
        //var_dump($confirmForm);
        $invoice = $this->get('session')->get('invoice');
        $invoiceBody = $this->get('session')->get('invoiceBody');

        $invoiceBody->getInvoiceId();
        if($confirmForm->isSubmitted() && $confirmForm->isValid()){

            $em->persist($invoice);
            $em->persist($invoiceBody);
            $em->flush();
            return $this->redirectToRoute('invoice_created',[
                'request' => $request
            ],307);
        }
        return $this->render('invoice/invoice-confirm.html.twig',[
            'invoice' => $invoice,'invoiceBody' => $invoiceBody,'confirmCreation' => $confirmForm->createView()
        ]);
    }

    /**
     * @Route("/invoice-created",name="invoice_created",methods={"POST"})
     * @param EntityManagerInterface $em
     * @param InvoiceRepository $invoiceRepository
     * @return string
     */
    public function invoiceCreated(EntityManagerInterface $em){

        //$confirmCreation = $this->createForm(ConfirmFormType::class);
        $invoiceRepository = $em->getRepository(Invoice::class);
        $invoice = $invoiceRepository->findBy([],['id'=>'DESC'],1,0);
        //var_dump($invoice);

        return $this->render('invoice/invoice-created.html.twig',[
            'invoices' => $invoice
        ]);
    }
}

解决方法

有两种解决方案:

a)手动生成ID(因此不会自动递增),然后在检查用户之后,保留并刷新对象(=存储到数据库),或者

[...]
    /**
     * @var int
     *
     * @ORM\Column(name="ID",type="integer",nullable=false,options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="App\Service\RandomIdGenerator")

     */
    private $id;
[...]

b)为发票编号创建一个(从ID)独立字段。 (您需要在数据库的Option-Table中的某个位置存储“ nextNumber”之类的东西,或生成该数字并交叉检查是否有不必要的复制)