2013-04-15 22 views
0

我正在嘗試使頁面處理我的invoces。我有一張表中的發票數據和另一張表中的發票行。這些表如下所示:Zend Framwork 2中的一對多映射關於教條

CREATE TABLE IF NOT EXISTS `Invoices` (
    `I_Id` int(10) NOT NULL AUTO_INCREMENT, 
    `I_Number` int(4) NOT NULL, 
    `I_ClientId` int(10) NOT NULL, 
    `I_ExtraText` text NOT NULL, 
    PRIMARY KEY (`I_Id`) 
) ENGINE=InnoDB 

CREATE TABLE IF NOT EXISTS `InvoiceRows` (
    `IR_Id` int(10) NOT NULL AUTO_INCREMENT, 
    `IR_InvoiceId` int(10) NOT NULL, 
    `IR_Price` int(10) NOT NULL, 
    `IR_Vat` smallint(2) unsigned NOT NULL, 
    `IR_Quantity` int(10) NOT NULL, 
    `IR_Text` varchar(255) NOT NULL, 
    PRIMARY KEY (`IR_Id`), 
    KEY `IR_InvoiceId` (`IR_InvoiceId`) 
) ENGINE=InnoDB 

這裏是我的映射:

class Invoice { 
    /** 
    * @ORM\OneToMany(targetEntity="Row", mappedBy="invoice" ,cascade={"persist"}) 
    */ 
    protected $rows; 
} 

class Row { 
    /** 
    * @ORM\ManyToOne(targetEntity="Invoice", inversedBy="rows", cascade={"persist"}) 
    * @ORM\JoinColumn(name="IR_InvoiceId", referencedColumnName="I_Id") 
    **/ 
    private $invoice; 
} 

我一直在努力遵循在doctrine docs上如何設置一個一對多的雙向映射的例子。然後連接Zend Framework 2和form collections。提取數據非常好。我得到每張發票的所有行。

我的問題是當我想寫回數據庫並保存我的更改。當我嘗試保存時出現以下錯誤:

An exception occurred while executing 'INSERT INTO 
MVIT_ADM__InvoiceRows (IR_InvoiceId, IR_Price, IR_Vat, IR_Quantity, 
IR_Text) VALUES (?, ?, ?, ?, ?)' with params 
{"1":null,"2":320,"3":0,"4":1,"5":"Learning your dog to sit"}: 

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 
'IR_InvoiceId' cannot be null 

我做錯了什麼?當檢查來自post的數據值不爲空時。

編輯:完整的源可以在Github

+0

正如你從錯誤信息中看到的,'IR_InvoiceId'的值是'null',根據你的'class Row'不允許'null'。你可以做兩件事:1)將IR_InvoiceId設置爲空或者2)確保給新實體一個IR_InvoiceId。當然,我建議後者。但是,要明白爲什麼它是'null',我需要看到控制器代碼在哪裏創建新的行實體並將其保留下來 – Pankrates

+0

錯誤消息非常清晰,並且可以在您的'InvoiceRows'表的這一行中看到創建語句''IR_InvoiceId' int(10)NOT NULL,' – Crisp

+0

當我檢查實體中的表單中的數據時,InvoiceId有一個值> $ this-> getEntityManager() - > persist($ invoice); > $ this-> getEntityManager() - > flush(); 該值已被清除,但其他人未被清除。 – Rickard

回答

0

發現似乎IR_InvoiceId空,它預計發票的編號(I_Id)值,所以一定要確保,當您將在InvoiceRows表中的數據,然後通過這裏的發票(I_Id)值爲IR_InvoiceId,因爲您提到了表格關係..

Best of Luck! Saran