我有一个“记录”实体,可以有N个“评论”。
这是这两个实体的设置:
记录
<entity name="Application\Model\Record" table="record">
<id name="recordID" type="integer">
<generator strategy="AUTO" />
</id>
<many-to-one field="user" target-entity="Application\Model\User">
<join-column name="userID" referenced-column-name="userID" />
</many-to-one>
<field name="status" type="string" nullable="false" />
<one-to-many field="comments" target-entity="Application\Model\RecordComment" mapped-by="record" />
</entity>
RecordComment
<entity name="Application\Model\RecordComment" table="recordComment">
<id name="recordCommentID" type="integer">
<generator strategy="AUTO" />
</id>
<indexes>
<index columns="userID" />
<index columns="recordID" />
</indexes>
<field name="comment" type="text" nullable="false" />
<field name="time" type="integer" length="11" nullable="false" />
<many-to-one field="user" target-entity="Application\Model\User">
<join-column name="userID" referenced-column-name="userID" />
</many-to-one>
<many-to-one field="record" target-entity="Application\Model\Record" inversed-by="comments">
<join-column name="recordID" referenced-column-name="recordID" />
</many-to-one>
</entity>
我正在努力研究如何创建表单以创建新记录,在其中添加多条评论。
如果我跳过评论,那么创建一个具有“status”字段并链接到用户的新记录非常简单。但是,当我尝试同时添加评论时,一切都崩溃了。
我创建了两个字段集,其中一个是注释,另一个是记录。但是,如何将recordComment链接到记录?我原以为链接会自动发生,因为recordComment被添加到记录中,但是在数据库中,recordID字段是NULL。
这是我的RecordComment字段集:
class RecordCommentFieldset extends Fieldset implements InputFilterProviderInterface
{
protected $objectManager;
public function __construct(ObjectManager $objectManager)
{
parent::__construct('recordComment');
$this->objectManager = $objectManager;
$this->setHydrator(new DoctrineHydrator($this->objectManager, 'Application\Model\RecordComment'))
->setObject(new RecordComment());
$this->add(array(
'name' => 'comment',
'type' => 'Zend\Form\Element\Textarea',
));
}
public function getInputFilterSpecification()
{
return array(
'comment' => array(
'required' => true,
),
);
}
}
我认为Doctrine会直接建立连接是错误的。 在以下情况之后,评论实际上已添加到记录中:
$form->setData($this->request->getPost());
但是,我必须手动迭代注释并在保留记录之前将记录分配给它们:
foreach($record->getComments() as $comment){
$comment->setRecord($record);
}
有没有其他方法可以解决这个问题,而无需手动迭代这些元素? 如果没有创建反向连接,那么将元素添加到我的实体中有什么意义呢?
答案 0 :(得分:0)
你做得对。至少这是doctrine documentation所说的(使用用户 - 评论示例):
即使您持有包含新注释的新用户,如果您删除了对EntityManager#persist($ myFirstComment)的调用,此代码也会失败。 Doctrine 2不会将持久化操作级联到所有新的嵌套实体。
但是,我会按照文档建议的方式进行,只是坚持评论:
(...)
foreach( $record->getComments() as $comment ) {
$comment->persist( $comment );
}
答案 1 :(得分:0)
我刚才问过这个问题,但这是我修复它的方法。
定义一对多关系时,请务必添加级联持久选项。这将确保您的子元素正确附加到您的对象并与其一起保持。
<one-to-many field="comments" target-entity="Application\Model\RecordComment" mapped-by="record">
<cascade>
<cascade-persist />
</cascade>
</one-to-many>
除非您需要添加任何其他关系(用户发布等),否则无需迭代所有注释