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();该值被清除,但其他值未被清除。它还尝试进行插入,而不是更新。:)听起来您的表单代码变得更加有趣;)实体的设置在我看来是有效的。。。