问题描述
因此,我想在将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”之类的东西,或生成该数字并交叉检查是否有不必要的复制)