Я получаю ошибку, когда пытаюсь очистить данные,
Предупреждение: spl_object_hash () ожидает, что параметр 1 будет объектом
вместе с этим сообщением
Найденный объект типа в ассоциации Subject \ Entity \ Subject # user, но ожидающий Subject \ Entity \ User
теперь вот действие, которое я пытаюсь реализовать
public function addAction() { $form = new SubjectForm(); $form->get('submit')->setAttribute('label', 'Add'); $request = $this->getRequest(); if (!$this->sessionVar) { $this->sessionVar = new SessionContainer('zftutorial'); $userid = $this->sessionVar->offsetGet('userid'); $form->get('user')->setAttribute('value', $userid); } $form->setData($request->getPost()); if ($request->isPost()) { $subject = new Subject(); $form->setInputFilter($subject->getInputFilter()); if ($form->isValid()) { $subject->populate($form->getData()); $this->getEntityManager()->persist($subject); $this->getEntityManager()->flush(); return $this->redirect()->toRoute('subject'); } } return array('form' => $form); }
и это мой subject.php
namespace Subject\Entity; use Doctrine\ORM\Mapping as ORM; use Zend\InputFilter\InputFilter; use Zend\InputFilter\Factory as InputFactory; use Zend\InputFilter\InputFilterAwareInterface; use Zend\InputFilter\InputFilterInterface; /** * * @ORM\Entity * @ORM\Table(name="subject") * @property string $subjectname * @property int $user_id * @property int $id */ class Subject implements InputFilterAwareInterface { protected $inputFilter; /** * @ORM\Id * @ORM\Column(type="integer"); * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string") */ protected $subjectname; /** * @ORM\ManyToOne(targetEntity="Subject\Entity\User", inversedBy="subjects") * @var User|null */ private $user; /** @return User|null */ public function getUser() { return $this->user; } /** @param User $user */ public function setUser(User $user) { if ($user === null || $user instanceof User) { $this->user = $user; } else { throw new InvalidArgumentException('$user must be instance of Entity\User or null!'); } } /** * Magic getter to expose protected properties. * * @param string $property * @return mixed */ public function __get($property) { return $this->$property; } /** * Magic setter to save protected properties. * * @param string $property * @param mixed $value */ public function __set($property, $value) { $this->$property = $value; } /** * Convert the object to an array. * * @return array */ public function getArrayCopy() { return get_object_vars($this); } /** * Populate from an array. * * @param array $data */ public function populate($data = array()) { $this->id = $data['id']; $this->subjectname = $data['subjectname']; $this->user = $data['user_id']; } public function setInputFilter(InputFilterInterface $inputFilter) { throw new \Exception("Not used"); } public function getInputFilter() { if (!$this->inputFilter) { $inputFilter = new InputFilter(); $factory = new InputFactory(); $inputFilter->add($factory->createInput(array( 'name' => 'id', 'filters' => array( array('name' => 'Int'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'subjectname', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'user_id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), ))); $this->inputFilter = $inputFilter; } return $this->inputFilter; } }
Я пытаюсь реализовать oneToMany, но я не знаю, что здесь не так.
Хорошо, нашел ответ
что я делаю неправильно, я делал это
if ($request->isPost()) { $subject = new Subject(); $form->setInputFilter($subject->getInputFilter()); if ($form->isValid()) { $subject->populate($form->getData()); $this->getEntityManager()->persist($subject); $this->getEntityManager()->flush(); return $this->redirect()->toRoute('subject'); } }
Вместо этого мне пришлось сначала найти релятивистскую сущность, подобную этой
if ($request->isPost()) { $subject = new Subject(); //following is the line i was looking for $user = $this->getEntityManager()->getRepository('Subject\Entity\User')->find(array('id'=>$userid)); $form->setInputFilter($subject->getInputFilter()); if ($form->isValid()) { //$user->add //$subject->setUser($user); $subject->populate($form->getData()); $subject->setUser($user); $this->getEntityManager()->persist($subject); $this->getEntityManager()->flush(); return $this->redirect()->toRoute('subject'); } }