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.因为我将在我的几个控制器中使用它,实际上这不适用于集合,如果我们输入了多个具有相同新的类别的文章