2014-11-05 109 views
3

我一直在堅持了幾天處理這個問題。我一直在評論其他StackOverflow問題和不同的論壇,但我無法得到這個工作,所以這就是這個問題的原因。獲取「完整性約束違規:1048列'payment_id'不能爲空」使用Doctrine&Symfony

我正在開發包含支付系統,所以我創建了一個「付款」類如下:

/** 
* 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關聯,這個關聯由form處理來驗證數據。之後的數據驗證,我想將其存儲在數據庫中後對其進行處理,所以我使用這些代碼行做到這一點:

$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」不能爲空

每個諮詢會歡迎和讚賞。

預先感謝您。

+0

我剛剛注意到你在@ payment中有@JMS \ Exclude()。 _「這個註解可以在一個屬性上定義,以表明這個屬性不應該被序列化/非序列化,只能和NoneExclusionPolicy結合使用。」_ dunno如果這個原因 – oskr 2014-11-05 16:37:00

+1

@oskr這是因爲當我通過API返回這個支付,我不想回復那個。感謝您的通知。 – 2014-11-05 16:38:56

+2

聽起來像這樣:(看看你的'公共函數添加paymentLine'在你的支付實體)http://stackoverflow.com/questions/26725679/symfony2-referencedcolumnname-id-is-null – webdev 2014-11-05 20:34:56

回答

4

感謝Keefe Kwan,我解決了我的問題。就像他的評論說,我的問題是由學說生成的代碼,「addPaymentLine」的方法更具體,該方法如下:

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

    return $this; 
} 

所以我編輯它加入這一行:

$paymentLines->setPayment($this); 

但是僅僅補充說,它沒有工作,所以我接過來一看,以this other question,和我沒有在表單中的「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 
        ] 
      ) 

最後,我的問題已經解決。謝謝你們的幫助。

Regards

+0

''by_reference' =>假'行爲我做了,很好的抓住!沒有它,在我的代碼中,'addPaymentLine()'setter將永遠不會被調用。 – DelphiLynx 2017-11-17 09:00:45

相關問題