Doctrine orm Zend Framwork 2中的一对多映射
我正在尝试制作一个我处理发票的页面。我在一个表中有发票数据,在另一个表中有发票行。各表如下:Doctrine orm Zend Framwork 2中的一对多映射,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我正在尝试制作一个我处理发票的页面。我在一个表中有发票数据,在另一个表中有发票行。各表如下: 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`) ) EN
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;
}
我一直在努力学习如何设置一对多的双向映射。然后连接Zend Framework 2和。拉取数据效果非常好。我得到每张发票的所有行
我的问题是当我想写回数据库并保存我的更改时。当我尝试保存时,出现以下错误:
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的数据时,值不为空
编辑:可以在中找到完整的源代码。似乎IR\u InvoiceId为空,它需要发票Id(I\u Id)值,因此请确保在InvoiceRows表中插入数据时,在这里将发票(I\u Id)值作为IR\u InvoiceId传递,正如您提到的表关系一样 祝你好运!
萨兰 从错误消息中可以看到,
IR\u InvoiceId
的值为null
,根据类行
不允许该值为null
。您可以做两件事:1)将IR\u InvoiceId
设置为可空,或2)确保为新实体提供IR\u InvoiceId
。我当然建议后者。然而,要想知道为什么它是null
,我需要查看创建新行实体并将其持久化的控制器代码。错误消息非常清楚,可以在InvoiceRows
表创建语句`IR\u InvoiceId
int(10)NOT null,`当我检查实体InvoiceId中表单的数据时,它有一个值,所以do>this->getEntityManager()->persist($invoice);>$这->getEntityManager()->flush();该值被清除,但其他值未被清除。它还尝试进行插入,而不是更新。:)听起来您的表单代码变得更加有趣;)实体的设置在我看来是有效的。。。