Zend2 - Doctrine2:创建具有多对一关系的新实体

时间:2013-09-06 20:17:14

标签: doctrine-orm zend-framework2

我有一个“记录”实体,可以有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);
}

有没有其他方法可以解决这个问题,而无需手动迭代这些元素? 如果没有创建反向连接,那么将元素添加到我的实体中有什么意义呢?

2 个答案:

答案 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>

除非您需要添加任何其他关系(用户发布等),否则无需迭代所有注释