php – Symfony ManyToMany表单
发布时间:2020-12-13 22:24:37 所属栏目:PHP教程 来源:网络整理
导读:我有实体技能和语言,专业,平台实体与ManyToMany的关系,当我创建技能时,我选择语言,平台和表格是有效的,正常持久和在DB中刷新.但是,当我创建语言或专业或平台时,我有错误此值无效并且在调试面板中.为什么我不明白,请帮忙: Message Origin CauseThis value is
我有实体技能和语言,专业,平台实体与ManyToMany的关系,当我创建技能时,我选择语言,平台和表格是有效的,正常持久和在DB中刷新.但是,当我创建语言或专业或平台时,我有错误此值无效并且在调试面板中.为什么我不明白,请帮忙:
Message Origin Cause This value is not valid. skills SymfonyComponentValidatorConstraintViolation Object(SymfonyComponentFormForm).children[skills] = [0 => AngularJS,1 => API] Caused by: SymfonyComponentFormExceptionTransformationFailedException Unable to reverse value for property path "skills": Could not find all matching choices for the given values Caused by: SymfonyComponentFormExceptionTransformationFailedException Could not find all matching choices for the given values 在我删除的实体中 /** * Constructor */ public function __construct() { $this->language = new DoctrineCommonCollectionsArrayCollection(); $this->platforms = new DoctrineCommonCollectionsArrayCollection(); $this->specialities = new DoctrineCommonCollectionsArrayCollection(); } 并且在语言,平台上也被删除了 实体: class Skill { use Timestampable; /** * @var integer * * @ORMColumn(name="id",type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ private $id; /** * @var MyBundleEntityCodeDirectoryProgramLanguages * * @ORMManyToMany(targetEntity="CodeDirectoryProgramLanguages",inversedBy="skills",cascade={"persist"}) */ protected $language; /** * @var MyBundleEntityCodeDirectoryPlatforms * * @ORMManyToMany(targetEntity="CodeDirectoryPlatforms",cascade={"persist"}) */ protected $platforms; /** * @var MyBundleEntityCodeDirectorySpecialities * * @ORMManyToMany(targetEntity="CodeDirectorySpecialities",cascade={"persist"}) */ protected $specialities; 一个例子: class CodeDirectorySpecialities { use Timestampable; /** * @var integer * * @ORMColumn(name="id",type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORMColumn(name="specialities",type="string",length=255) */ private $specialities; /** * @ORMManyToMany(targetEntity="MyBundleEntitySkill",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'=>'MyBundleEntitySkill','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',array( 'class' => 'AppBundleEntitySkill','property' => 'skill','multiple' => true,'expanded' => true )) ; } 为你的另外两个子表格做同样的事情 如果您想在创建专业时选择一项或多项技能,则只需在控制器中执行: $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()))); } 由于您之间的多对多关系,技能将自动更新 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |