得到";完整性约束违反:1048列';payment_id';不能为空“;使用条令&;Symf


Getting "Integrity constraint violation: 1048 Column 'payment_id' cannot be null" using Doctrine & Symfony

我在处理这个问题上已经被困了好几天了。我一直在复习其他StackOverflow问题和不同的论坛,但我无法让它发挥作用,所以这就是这个问题的原因。

我正在开发一个包含支付的系统,所以我创建了一个"支付"类,如下所示:

/**
 * Payment
 *
 * @ORM'Table()
 * @ORM'Entity(repositoryClass="PaymentRepository")
 */
 class Payment
 {
   /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     * @JMS'Groups({"public"})
     * @JMS'Type("integer")
     */
     protected $id;
   /**
     * @var ArrayCollection
     *
     * @ORM'OneToMany(targetEntity="PaymentLine", mappedBy="payment", cascade={"persist",    "remove"})
     * @Assert'Valid()
     * @JMS'Groups({"public","create"})
     * @JMS'Type("ArrayCollection<JensenTech'PaymentBundle'Entity'PaymentLine>")
     */
     protected $paymentLines;
     /**
       * @var string
       *
       * @ORM'Column(name="total_net", type="decimal", precision=5, scale=2)
       * @Assert'NotBlank(message="Invalid Net Amount")
       * @JMS'Groups({"public","create"})
       */
       protected $totalNet;
     /**
       * @var string
       * @ORM'Column(name="total_vat", type="decimal", precision=5, scale=2)
       * @Assert'NotBlank(message="Invalid VAT Amount")
       * @JMS'Groups({"public","create"})
       */
       protected $totalVat;
      /**
        * @var string
        * @ORM'Column(name="total_gross", type="decimal", precision=5, scale=2)
        * @Assert'NotBlank(message="Invalid Gross Amount")
        * @JMS'Groups({"public","create"})
        */
        protected $totalGross;
}

我创建了另一个名为PaymentLine的类来存储每条支付线的详细信息:

/**
  * PaymentLine
  *
  * @ORM'Table()
  * @ORM'Entity
  * @ORM'HasLifecycleCallbacks()
  */
  class PaymentLine
  {
   /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     * @JMS'Exclude()
     */
     protected $id;
   /**
     * @var Payment
     * @ORM'ManyToOne(targetEntity="Payment", inversedBy="paymentLines")
     * @ORM'JoinColumn(nullable=false)
     * @JMS'Exclude()
     */
     protected $payment;
   /**
     * @var string
     *
     * @ORM'Column(name="concept", type="string", length=255)
     * @JMS'Groups({"public", "create"})
     */
     protected $concept;
   /**
     * @var integer
     *
     * @ORM'Column(name="quantity", type="smallint")
     * @JMS'Groups({"public", "create"})
     */
     protected $quantity;
   /**
     * @var float
     *
     * @ORM'Column(name="unit_price", type="decimal", precision=5, scale=2)
     * @JMS'Groups({"public", "create"})
     */
    protected $unitPrice;
}

正如您所看到的,这是一个OneToMany关联,该关联由表单处理以验证数据。在数据被验证后,我想将其存储在数据库中以进行处理,所以我使用以下代码行来完成这项工作:

 $payment = new Payment();
 $paymentForm = $this->createForm('payment', $payment);
 $paymentForm->handleRequest($request);
 if ($paymentForm->isValid()) {            
    $entityManager = $this->getDoctrine()->getManager();
    $entityManager->persist($payment);
    $entityManager->flush();
 }

此代码处理接收所有付款数据(付款数据和付款行数据)的表单,以验证这些数据并将其存储在数据库中。当我执行此代码时,我会得到以下错误:

SQLSTATE[23000]:违反完整性约束:1048列"payment_id"不能为空

每一条建议都将受到欢迎和赞赏。

提前谢谢。

感谢关,我解决了我的问题。正如他在评论中所说,我的问题是由Doctrine生成的代码,"addPaymentLine"方法更具体地说,这种方法如下:

/**
 * Add paymentLines
 *
 * @param PaymentLine $paymentLines
 * @return Payment
 */
public function addPaymentLine(PaymentLine $paymentLines)
{
    $this->paymentLines[] = $paymentLines;
    return $this;
}

所以我编辑了它,添加了这行:

$paymentLines->setPayment($this);

但只是补充说它不起作用,所以我看了看另一个问题,我在表格中没有"by_reference"参数,所以我的表格是这样的:

$builder
            ->add('payment_lines', 'collection',
                    [
                'type' => new PaymentLineType(),
                'allow_add' => true
                    ]
            )

所以添加这个参数,我的表单现在是这样的:

$builder
            ->add('payment_lines', 'collection',
                    [
                'type' => new PaymentLineType(),
                'allow_add' => true,
                'by_reference' => false
                    ]
            )

所以,我的问题终于解决了。谢谢你们的帮助。

问候