有两个实体(人n:1手机),我想在personEntity中嵌入phoneEntity。 我做了基于symfony2嵌入式表单教程的任何事情,但我发现了这个错误:
通过这种关系找到了一个新的实体 ' S1 \ EphoneBundle \实体\ PersonEntity#phoneEntity'那不是 配置为级联实体的持久化操作: S1 \ EphoneBundle \实体\ PhoneEntity @ 0000000033dcabf90000000076607b90。 解决此问题:显式调用EntityManager#persist()on 这个未知的实体或配置级联持久存在此关联 映射例如@ManyToOne(..,cascade = {" persist"})。如果你 无法找出导致问题实施的实体 ' S1 \ EphoneBundle \实体\ PhoneEntity #__的toString()'得到一个线索。
以下是我在personEntityController
中的新动作:
public function newAction()
{
$entity = new PersonEntity();
$ph1 = new PhoneEntity();
$entity->getPhoneEntity()->add($ph1);
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->persist($ph1);
$form = $this->createCreateForm($entity);
return $this->render('S1EphoneBundle:PersonEntity:new.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
我的人类型:
<?php
namespace S1\EphoneBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class PersonEntityType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('address')
->add('type')
->add('birthDay');
$builder
->add('phoneEntity', 'collection', array(
'type' => new PhoneEntityType(),
'allow_add' => true
)
)
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'S1\EphoneBundle\Entity\PersonEntity'
));
}
/**
* @return string
*/
public function getName()
{
return 's1_ephonebundle_personentity';
}
}
我的人实体:
<?php
namespace S1\EphoneBundle\Entity;
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity
*/
class PersonEntity
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=false)
*/
private $name;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $address;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $type;
/**
* @ORM\Column(type="date", nullable=true)
*/
private $birthDay;
/**
* @ORM\OneToMany(targetEntity="PhoneEntity", mappedBy="personEntity")
*/
private $phoneEntity;
/**
* Constructor
*/
public function __construct()
{
$this->phoneEntity = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return PersonEntity
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set address
*
* @param string $address
* @return PersonEntity
*/
public function setAddress($address)
{
$this->address = $address;
return $this;
}
/**
* Get address
*
* @return string
*/
public function getAddress()
{
return $this->address;
}
/**
* Set type
*
* @param boolean $type
* @return PersonEntity
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return boolean
*/
public function getType()
{
return $this->type;
}
/**
* Set birthDay
*
* @param \DateTime $birthDay
* @return PersonEntity
*/
public function setBirthDay($birthDay)
{
$this->birthDay = $birthDay;
return $this;
}
/**
* Get birthDay
*
* @return \DateTime
*/
public function getBirthDay()
{
return $this->birthDay;
}
/**
* Add phoneEntity
*
* @param \S1\EphoneBundle\Entity\PhoneEntity $phoneEntity
* @return PersonEntity
*/
public function addPhoneEntity(\S1\EphoneBundle\Entity\PhoneEntity $phoneEntity)
{
$this->phoneEntity[] = $phoneEntity;
return $this;
}
/**
* Remove phoneEntity
*
* @param \S1\EphoneBundle\Entity\PhoneEntity $phoneEntity
*/
public function removePhoneEntity(\S1\EphoneBundle\Entity\PhoneEntity $phoneEntity)
{
$this->phoneEntity->removeElement($phoneEntity);
}
/**
* Get phoneEntity
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getPhoneEntity()
{
return $this->phoneEntity;
}
public function __toString()
{
return $this->id."->".$this->name;
}
}
我的手机实体:
<?php
namespace S1\EphoneBundle\Entity;
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity
*/
class PhoneEntity
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=12, nullable=false)
*/
private $number;
/**
* @ORM\ManyToOne(targetEntity="PersonEntity", inversedBy="phoneEntity", cascade={"persist"})
* @ORM\JoinColumn(name="pid", referencedColumnName="id")
*/
private $personEntity;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set number
*
* @param string $number
* @return PhoneEntity
*/
public function setNumber($number)
{
$this->number = $number;
return $this;
}
/**
* Get number
*
* @return string
*/
public function getNumber()
{
return $this->number;
}
/**
* Set personEntity
*
* @param \S1\EphoneBundle\Entity\PersonEntity $personEntity
* @return PhoneEntity
*/
public function setPersonEntity(\S1\EphoneBundle\Entity\PersonEntity $personEntity)
{
$this->personEntity = $personEntity;
return $this;
}
/**
* Get personEntity
*
* @return \S1\EphoneBundle\Entity\PersonEntity
*/
public function getPersonEntity()
{
return $this->personEntity;
}
}
答案 0 :(得分:0)
当您persist()
PersonEntity
然后PhoneEntity
个实体时,Doctrine2正在寻找id
PersonEntity
,以便将此人与电话相关联。缺少此id
会导致错误。
您必须在2 flush()
次操作之间致电persist()
:
# this is needed at the start of the file
use Symfony\Component\HttpFoundation\Request;
public function newAction(Request $request)
{
$entity = new PersonEntity();
$ph1 = new PhoneEntity();
$entity->addPhoneEntity($ph1);
$form = $this->createForm(new PersonEntityType(), $entity);
$form->handleRequest($request);
if ($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$em->persist($ph1);
$em->flush();
$em->persist($entity);
$em->flush();
}
return $this->render('S1EphoneBundle:PersonEntity:new.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
答案 1 :(得分:0)
试试这个
/**
* Add phoneEntity
*
* @param \S1\EphoneBundle\Entity\PhoneEntity $phoneEntity
* @return PersonEntity
*/
public function addPhoneEntity(\S1\EphoneBundle\Entity\PhoneEntity $phoneEntity)
{
$this->phoneEntity[] = $phoneEntity;
$phoneEntity->setPersonEntity($this);
return $this;
}
/**
* set PhoneEntity
*
* @param \Doctrine\Common\Collections\ArrayCollection $phones
*/
public function setPhoneEntity(\Doctrine\Common\Collections\ArrayCollection $phones) {
foreach ($phones as $phone) {
$phone->setPersonEntity($this);
}
$this->phoneEntity = $phones;
}