我有实体技能和语言、专业、平台实体与 ManyToMany 关系,当我创建技能时,我选择语言、专业、平台和表单是有效的,并且在数据库中正常持久和刷新。但是,当我创建语言或专业或平台时,出现错误此值无效且在调试面板中的表单中。为什么我不明白,请帮助:
Message Origin Cause
This value is not valid. skills Symfony\Component\Validator\ConstraintViolation
Object(Symfony\Component\Form\Form).children[skills] = [0 => AngularJS, 1 => API]
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Unable to reverse value for property path "skills": Could not find all matching choices for the given values
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Could not find all matching choices for the given values
在我删除的实体中
/**
* Constructor
*/
public function __construct()
{
$this->language = new \Doctrine\Common\Collections\ArrayCollection();
$this->platforms = new \Doctrine\Common\Collections\ArrayCollection();
$this->specialities = new \Doctrine\Common\Collections\ArrayCollection();
}
并且在语言、专业、平台方面也被删除了
实体:
class Skill
{
use Timestampable;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \MyBundle\Entity\CodeDirectoryProgramLanguages
*
* @ORM\ManyToMany(targetEntity="CodeDirectoryProgramLanguages", inversedBy="skills", cascade={"persist"})
*/
protected $language;
/**
* @var \MyBundle\Entity\CodeDirectoryPlatforms
*
* @ORM\ManyToMany(targetEntity="CodeDirectoryPlatforms", inversedBy="skills", cascade={"persist"})
*/
protected $platforms;
/**
* @var \MyBundle\Entity\CodeDirectorySpecialities
*
* @ORM\ManyToMany(targetEntity="CodeDirectorySpecialities", inversedBy="skills", cascade={"persist"})
*/
protected $specialities;
和一个例子:
class CodeDirectorySpecialities
{
use Timestampable;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="specialities", type="string", length=255)
*/
private $specialities;
/**
* @ORM\ManyToMany(targetEntity="MyBundle\Entity\Skill", mappedBy="specialities", cascade={"persist"})
*/
protected $skills;
并添加到所有实体
public function __toString()
{
return $this->string_filed_entity;
}
这是我的表格
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('specialities');
$builder->add('skills','entity',
array(
'class'=>'MyBundle\Entity\Skill',
'property'=>'skill',
'multiple'=>true,
'expanded' => true,
)
);
}
和行动
$entity = new CodeDirectorySpecialities();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$skills = $entity->getSkills()->getValues();
if(!empty($skills)){
foreach($skills as $skill){
$skill->addSpeciality($entity);
$em->persist($skill);
}
}
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('specialities_show', array('id' => $entity->getId())));
}
最佳答案
这是因为 html5 验证器以您的专业、平台和语言形式阻止了您。
要添加专业,您不需要技能,因此您必须向您的建筑商发布广告:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('specialities')
->add('skills', , 'entity', array(
'class' => 'AppBundle\Entity\Skill',
'property' => 'skill',
'multiple' => true,
'expanded' => true
))
;
}
并为您的其他 2 个“子表单”执行相同操作
如果您想在创建专长时选择一项或多项技能,只需在 Controller 中执行以下操作:
$entity = new CodeDirectorySpecialities();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$entity = $form->getData();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('specialities_show', array('id' => $entity->getId())));
}
由于两者之间的多对多关系,技能将自动更新
关于php - Symfony 多对多形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33666771/