加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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())));
}

由于您之间的多对多关系,技能将自动更新

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读