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

How to configure entities in zf2 for ManyToOne unidirectional doctrine mapping

我在使用 doctrine 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
            ),
        );

    }

}

通过此配置,我能够 "get" 从 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 可能不是使用正确的表单元素。但是,如果它不是一个集合,那它是什么?

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

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

所以 setter 应该是这样的:

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

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