我在使用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
),
);
}
}
使用此配置,我可以从MyMessage
到getMyMessage()
“获取”数据,因此我知道这些表已加入。但是,当我尝试在表单中绑定实体时,出现错误:
文件:
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
可能不是正确的形式要使用的元素。但是,如果它不是一个集合,它是什么?
答案 0 :(得分:1)
你完全正确。您的MyMessage不应该是Collection
。它应该只是MyMessage
的一个实例。
您在ManyToOne
和MyPageItem
之间定义了MyMessage
,这意味着一个页面项目包含一条消息,而一条消息包含许多页面项目。但由于它是单向关系,因此最后一部分永远不会被定义。
所以setter应该是这样的:
/**
* @param MyMessage $myMessage
*/
public function setMyMessage(MyMessage $myMessage = null)
{
$this->myMessage = $myMessage;
}
您还应该将表单字段定义更改为单个MyMessage
项。