如何在 zf2 中为多对一单向原则映射配置实体



我在使用 ManyToOne 单向关系在 zf2 中开发表单时遇到了麻烦。 我的实体如下所示:

namespace AdminMyPagesEntity;
class MyPageItem
{
    // ... 
    /**
     * @ORMManyToOne(targetEntity="MyMessage")
     * @ORMJoinColumn(name="myMessageID", referencedColumnName="myMessageID")
     **/
    private $myMessage;
    // ... 
    /**
     * Allow null to remove association
     *
     * @param Collection $myMessage
     */
    public function setMyMessage(Collection $myMessage = null)
    {
        $this->myMessage = $myMessage;
    }
    /**
     * @return myMessage
     */
    public function getMyMessage()
    {
        return $this->myMessage;
    }
}
class MyMessage
{
    // ... 
}

MyPageItemFieldset的字段集如下所示:

namespace AdminMyPagesForm;
class MyPageItemFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('mypage-item-fieldset');
        $this->setHydrator(new DoctrineHydrator($objectManager, 'AdminMyPagesEntityMyPageItem'))
             ->setObject(new MyPageItem());
        // ...
        $myMessageFieldset = new MyMessageFieldset($objectManager);
        $this->add(array(
            'type'    => 'ZendFormElementCollection',
            'name'    => 'myMessage',
            'options' => array(
                'count'           => 1,
                'target_element' => $myMessageFieldset
            )
        ));
    }
    public function getInputFilterSpecification()
    {
        // ...
        return array(
            'myMessage' => array(
                'required' => false
            ),
        );
    }
}

使用此配置,我能够从MyMessagegetMyMessage()"获取"数据,因此我知道表已连接。 但是,当我尝试在表单中绑定实体时,出现错误:

文件:

C:xampphtdocsGetOutvendorzendframeworkzendframeworklibraryZendFormElementCollection.php:167

消息:

ZendFormElementCollection::setObject expects an array or Traversable object argument; received "DoctrineORMModuleProxy__CG__AdminMyPagesEntityMyMessage"

堆栈跟踪:

#0  ...  ZendFormElementCollection->setObject(Object(DoctrineORMModuleProxy__CG__AdminMyPagesEntityMyMessage))
    ...

我的一个想法是,由于 ManyToOne 关系只会产生一个匹配项,因此MyMessage字段集几乎不是一个集合 - 它只是一个项目 - 所以ZendFormElementCollection可能不是要使用的正确表单元素。 但是,如果它不是一个集合,它是什么?

你是完全正确的。您的"我的消息"不应该是Collection。它应该只是MyMessage的一个实例。

您在MyPageItemMyMessage之间定义了ManyToOne,这意味着一个页面项目具有一条消息,而一条消息具有许多页面项目。但由于它是单向关系,因此从未定义最后一部分。

所以二传手应该看起来像这样:

/**
 * @param MyMessage $myMessage
 */
public function setMyMessage(MyMessage $myMessage = null)
{
    $this->myMessage = $myMessage;
}

您还应该将表单字段定义更改为单个MyMessage项。

相关内容

  • 没有找到相关文章

最新更新