如何在 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" 从 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
可能不是使用正确的表单元素。但是,如果它不是一个集合,那它是什么?
你完全正确。您的 MyMessage 不应该是 Collection
。它应该只是 MyMessage
的一个实例。
您在 MyPageItem
和 MyMessage
之间定义了一个 ManyToOne
,这意味着一个页面项目有一条消息,而一条消息有多个页面项目。但由于它是单向关系,因此最后一部分从未定义。
所以 setter 应该是这样的:
/**
* @param MyMessage $myMessage
*/
public function setMyMessage(MyMessage $myMessage = null)
{
$this->myMessage = $myMessage;
}
并且您还应该将表单字段定义更改为单个 MyMessage
项。
我在使用 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" 从 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
可能不是使用正确的表单元素。但是,如果它不是一个集合,那它是什么?
你完全正确。您的 MyMessage 不应该是 Collection
。它应该只是 MyMessage
的一个实例。
您在 MyPageItem
和 MyMessage
之间定义了一个 ManyToOne
,这意味着一个页面项目有一条消息,而一条消息有多个页面项目。但由于它是单向关系,因此最后一部分从未定义。
所以 setter 应该是这样的:
/**
* @param MyMessage $myMessage
*/
public function setMyMessage(MyMessage $myMessage = null)
{
$this->myMessage = $myMessage;
}
并且您还应该将表单字段定义更改为单个 MyMessage
项。