我在使用 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
),
);
}
}
使用此配置,我能够从MyMessage
到getMyMessage()
"获取"数据,因此我知道表已连接。 但是,当我尝试在表单中绑定实体时,出现错误:
文件:
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
的一个实例。
您在MyPageItem
和MyMessage
之间定义了ManyToOne
,这意味着一个页面项目具有一条消息,而一条消息具有许多页面项目。但由于它是单向关系,因此从未定义最后一部分。
所以二传手应该看起来像这样:
/**
* @param MyMessage $myMessage
*/
public function setMyMessage(MyMessage $myMessage = null)
{
$this->myMessage = $myMessage;
}
您还应该将表单字段定义更改为单个MyMessage
项。