Doctrine 创建链接对象的多个表单

Doctrine 创建链接对象的多个表单,doctrine,symfony,Doctrine,Symfony,想象一下这两个实体: Article title description category <- ManyToOne Category name 这将允许我从现有类别中进行选择 现在,如果需要,我希望能够创建类别 Title [ ] Description [ ] [ ] Category [ ] 类

想象一下这两个实体:

Article
  title
  description
  category <- ManyToOne

Category
  name
这将允许我从现有类别中进行选择

现在,如果需要,我希望能够创建类别

Title    [                 ]
Description
[                          ]
[                          ]
Category [                 ]
类别字段将是一个自由文本框。
如果文本不对应任何类别,将创建并附加一个新类别。
我尝试了一些
DataTransformer
,但没有成功

我需要一个可重用的解决方案来管理它,因为我需要将它作为集合嵌入到另一个表单中

我如何才能做到这一点?

建议您在分类中使用“如果”。 当您检查表单提交是否有效并已提交时,获取“类别”数据,如果不存在,则将其作为新类别保留,然后在提交后查询文章

代码可能是这样的:

if ($form-isSubmitted() && $form->isValid()){
    $catName = $form->get('category')->getData();   // Get category.

    // Query if it exists.
    $qb = $em->createQueryBuilder();
    $qb->select('c')
        ->from('AppBundle:Category', 'c')
        ->where('c.name = :catName')
        ->setParameter('catName', $catName);
    $cat_results = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult();

    if ($cat_results == null){
        $newCat = new Category();
        $newCat()->setname($catName);
        $em->persist($newCat);
        $em->flush();
    }
    else{
        ...
        \\ Render your form etc...
    }
希望你能明白。上面的代码更简单,因为这样您就可以以相同的形式创建类别。

建议您对类别执行“如果”。 当您检查表单提交是否有效并已提交时,获取“类别”数据,如果不存在,则将其作为新类别保留,然后在提交后查询文章

代码可能是这样的:

if ($form-isSubmitted() && $form->isValid()){
    $catName = $form->get('category')->getData();   // Get category.

    // Query if it exists.
    $qb = $em->createQueryBuilder();
    $qb->select('c')
        ->from('AppBundle:Category', 'c')
        ->where('c.name = :catName')
        ->setParameter('catName', $catName);
    $cat_results = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult();

    if ($cat_results == null){
        $newCat = new Category();
        $newCat()->setname($catName);
        $em->persist($newCat);
        $em->flush();
    }
    else{
        ...
        \\ Render your form etc...
    }

希望你能明白。上面的代码更简单,因为之后您将以相同的形式创建类别。

以下是我使用

我的
文章类型

class ArticleType扩展了AbstractType
{
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$builder
->添加('名称')
->添加('说明')
->添加('category',CategoryType::class)
//...
新的
类别类型
类别:

class CategoryType扩展了AbstractType
{
受保护的$myService;
公共函数构造(MyService$MyService)
{
$this->myService=$myService;
}
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$transformer=新类别变压器($this->myService);
$builder->addModelTransformer($transformer);
}
}
注册为服务

app.form.category\u类型:
类:AppBundle\Form\CategoryType
参数:['@app.my.service']
标签:
-{name:form.type}
最后是变压器:

类CategoryTransformer实现DataTransformerInterface
{
//…MyService初始化。。。
公共职能转变($类别)
{
如果(空==$category){
返回“”;
}
返回$category->getName();
}
公共函数reverseTransform($categoryName)
{
如果(!$categoryName){
返回null;
}
$category=$this->myService->getOrCreateCategoryFromName($categoryName);
如果(空==$category){
抛出新的TransformationFailedException();
}
返回$category;
}
}
MyService
负责使用实体管理器获取或创建具有给定名称的类别

相当多的代码行,但一旦完成,无论我在哪里使用我的表单,都可以用简单的标准方式进行处理:

$articleForm=$this->createForm(ArticleType::class,$article);
$articleForm->handleRequest($request);
如果($articleForm->isValid()){
$em->persist($article);
$em->flush();
//...

以下是我使用

我的
文章类型

class ArticleType扩展了AbstractType
{
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$builder
->添加('名称')
->添加('说明')
->添加('category',CategoryType::class)
//...
新的
类别类型
类别:

class CategoryType扩展了AbstractType
{
受保护的$myService;
公共函数构造(MyService$MyService)
{
$this->myService=$myService;
}
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$transformer=新类别变压器($this->myService);
$builder->addModelTransformer($transformer);
}
}
注册为服务

app.form.category\u类型:
类:AppBundle\Form\CategoryType
参数:['@app.my.service']
标签:
-{name:form.type}
最后是变压器:

类CategoryTransformer实现DataTransformerInterface
{
//…MyService初始化。。。
公共职能转变($类别)
{
如果(空==$category){
返回“”;
}
返回$category->getName();
}
公共函数reverseTransform($categoryName)
{
如果(!$categoryName){
返回null;
}
$category=$this->myService->getOrCreateCategoryFromName($categoryName);
如果(空==$category){
抛出新的TransformationFailedException();
}
返回$category;
}
}
MyService
负责使用实体管理器获取或创建具有给定名称的类别

相当多的代码行,但一旦完成,无论我在哪里使用我的表单,都可以用简单的标准方式进行处理:

$articleForm=$this->createForm(ArticleType::class,$article);
$articleForm->handleRequest($request);
如果($articleForm->isValid()){
$em->persist($article);
$em->flush();
//...

谢谢你的回答。我忘了提到我正在搜索一个可重用的解决方案,可能涉及一个
数据转换器
或其他什么。因为我将在我的几个控制器中使用它。谢谢你的回答。我忘了提到我正在搜索一个可重用的解决方案,可能涉及一个
数据转换器
或其他什么ing.因为我将在我的几个控制器中使用它,实际上这不适用于集合,如果我们输入了多个具有相同新的
类别的
文章