У меня возникают проблемы при разработке формы в zf2 с использованием доктрины однонаправленных отношений ManyToOne. Мои сущности выглядят так:
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
fieldset вряд ли является коллекцией — это всего лишь один элемент — так Zend\Form\Element\Collection
не может быть правильным элементом формы для использования. Но если это не коллекция, что это?
Вы совершенно правы. Ваше сообщение не должно быть Collection
, Это должно быть просто MyMessage
,
Вы определили ManyToOne
между MyPageItem
а также MyMessage
Это означает, что один элемент страницы имеет одно сообщение, а сообщение содержит много элементов страницы. Но поскольку это однонаправленные отношения, последняя часть никогда не определяется.
Поэтому сеттер должен выглядеть так:
/**
* @param MyMessage $myMessage
*/
public function setMyMessage(MyMessage $myMessage = null)
{
$this->myMessage = $myMessage;
}
И вы также должны изменить определение поля формы на один MyMessage
вещь.
Других решений пока нет …