如何在zf2中为ManyToOne单向逻辑映射配置实体

时间:2015-04-13 23:03:27

标签: php doctrine-orm zend-framework2 many-to-one

我在使用DocTine ManyToOne单向关系在zf2中开发表单时遇到问题。我的实体看起来像这样:

namespace AdminMyPages\Entity;

class MyPageItem
{
    // ... 

    /**
     * @ORM\ManyToOne(targetEntity="MyMessage")
     * @ORM\JoinColumn(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 AdminMyPages\Form;

class MyPageItemFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('mypage-item-fieldset');

        $this->setHydrator(new DoctrineHydrator($objectManager, 'AdminMyPages\Entity\MyPageItem'))
             ->setObject(new MyPageItem());

        // ...

        $myMessageFieldset = new MyMessageFieldset($objectManager);
        $this->add(array(
            'type'    => 'Zend\Form\Element\Collection',
            'name'    => 'myMessage',
            'options' => array(
                'count'           => 1,
                'target_element' => $myMessageFieldset
            )
        ));

    }

    public function getInputFilterSpecification()
    {

        // ...

        return array(
            'myMessage' => array(
                'required' => false
            ),
        );

    }

}

使用此配置,我可以从MyMessagegetMyMessage()“获取”数据,因此我知道这些表已加入。但是,当我尝试在表单中绑定实体时,出现错误:

文件:

C:\xampp\htdocs\GetOut\vendor\zendframework\zendframework\library\Zend\Form\Element\Collection.php:167

消息:

Zend\Form\Element\Collection::setObject expects an array or Traversable object argument; received "DoctrineORMModule\Proxy\__CG__\AdminMyPages\Entity\MyMessage"

堆栈追踪:

#0  ...  Zend\Form\Element\Collection->setObject(Object(DoctrineORMModule\Proxy\__CG__\AdminMyPages\Entity\MyMessage))
    ...

我有一个想法是,由于ManyToOne关系只会产生一个匹配,MyMessage字段集几乎不是一个集合 - 它只是一个项目 - 所以Zend\Form\Element\Collection可能不是正确的形式要使用的元素。但是,如果它不是一个集合,它是什么?

1 个答案:

答案 0 :(得分:1)

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

您在ManyToOneMyPageItem之间定义了MyMessage,这意味着一个页面项目包含一条消息,而一条消息包含许多页面项目。但由于它是单向关系,因此最后一部分永远不会被定义。

所以setter应该是这样的:

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

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