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
正如你從錯誤信息中看到的,'IR_InvoiceId'的值是'null',根據你的'class Row'不允許'null'。你可以做兩件事:1)將IR_InvoiceId設置爲空或者2)確保給新實體一個IR_InvoiceId。當然,我建議後者。但是,要明白爲什麼它是'null',我需要看到控制器代碼在哪裏創建新的行實體並將其保留下來 – Pankrates
錯誤消息非常清晰,並且可以在您的'InvoiceRows'表的這一行中看到創建語句''IR_InvoiceId' int(10)NOT NULL,' – Crisp
當我檢查實體中的表單中的數據時,InvoiceId有一個值> $ this-> getEntityManager() - > persist($ invoice); > $ this-> getEntityManager() - > flush(); 該值已被清除,但其他人未被清除。 – Rickard