1

我有一个可以有 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>

记录评论

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

我正在努力创建一个表单来创建一个新记录,在其中添加多个评论。

如果我跳过评论,创建具有“状态”字段并链接到用户的新记录非常简单。但是,当我尝试同时向它添加评论时,一切都崩溃了。

我创建了两个字段集,一个是评论,一个是记录。但是,如何将 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);
}

有没有另一种方法来解决这个问题,而无需手动迭代元素?如果没有创建反向连接,那么将元素添加到我的实体有什么意义?

4

2 回答 2

0

我前段时间问过这个问题,但这是我修复它的方法。

定义一对多关系时,请确保添加级联持久选项。这将确保您的子元素正确附加到您的对象并与它一起保留。

<one-to-many field="comments" target-entity="Application\Model\RecordComment" mapped-by="record">
    <cascade>
        <cascade-persist />
    </cascade>
</one-to-many>

无需遍历所有评论,除​​非您需要添加任何其他关系(用户发布等)

于 2014-02-05T17:11:31.653 回答
0

你做得对。至少这是教义文档所说的(使用用户评论示例):

即使您保留一个包含我们新评论的新用户,如果您删除对 EntityManager#persist($myFirstComment) 的调用,此代码也会失败。Doctrine 2 不会将持久化操作级联到所有新的嵌套实体。

但是我会按照文档建议的方式做,只是坚持评论:

(...)
foreach( $record->getComments() as $comment ) {
    $comment->persist( $comment );
}
于 2013-09-20T15:26:27.697 回答