首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

表单不在Symfony 4中呈现OneToMany关系的字段

在Symfony 4中,表单不直接呈现OneToMany关系的字段。OneToMany关系是指一个实体对象拥有多个关联的实体对象。在Symfony中,OneToMany关系通常通过CollectionType表单字段来表示。

CollectionType字段允许用户动态添加、删除和编辑关联实体对象。它通常与EntityType字段结合使用,用于选择关联实体对象。

要在Symfony 4中呈现OneToMany关系的字段,可以按照以下步骤进行操作:

  1. 在实体类中定义OneToMany关系。例如,假设有一个User实体类和一个Comment实体类,一个User可以拥有多个Comment:
代码语言:txt
复制
// src/Entity/User.php

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

class User
{
    // ...

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="user")
     */
    private $comments;

    public function __construct()
    {
        $this->comments = new ArrayCollection();
    }

    // ...
}
  1. 创建一个表单类来表示User实体类。在表单类中,使用CollectionType字段来表示OneToMany关系的字段:
代码语言:txt
复制
// src/Form/UserType.php

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...

            ->add('comments', CollectionType::class, [
                'entry_type' => CommentType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false,
            ])
        ;
    }

    // ...
}

在上面的代码中,'entry_type'参数指定了关联实体对象的表单类型(例如CommentType),'allow_add'参数允许用户动态添加关联实体对象,'allow_delete'参数允许用户删除关联实体对象,'by_reference'参数设置为false,确保关联实体对象的变化能够正确保存到数据库中。

  1. 在控制器中使用表单类来处理表单数据:
代码语言:txt
复制
// src/Controller/UserController.php

use App\Entity\User;
use App\Form\UserType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class UserController extends AbstractController
{
    /**
     * @Route("/user/new", name="user_new", methods={"GET", "POST"})
     */
    public function new(Request $request): Response
    {
        $user = new User();
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // 保存用户和关联的评论到数据库中
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($user);
            $entityManager->flush();

            return $this->redirectToRoute('user_show', ['id' => $user->getId()]);
        }

        return $this->render('user/new.html.twig', [
            'form' => $form->createView(),
        ]);
    }

    // ...
}

在上面的代码中,'new'方法用于处理创建新用户的表单提交。首先创建一个User实体对象,然后使用UserType表单类创建表单对象。通过调用handleRequest方法处理表单数据,如果表单数据有效,则将用户和关联的评论保存到数据库中。

这样,就可以在Symfony 4中呈现OneToMany关系的字段。对于更多关于Symfony表单的信息,可以参考Symfony官方文档:Symfony Forms

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django学习笔记之Queryset详解

Django ORM用到三个类:Manager、QuerySet、Model。Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet:Manager类的一些方法会返回QuerySet实例,QuerySet是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径,那就是自定义manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;django.db.models模块中的Model类,我们定义表的model时,就是继承它,它的功能很强大,通过自定义model的instance可以获取外键实体等,它的方法都是记录级方法(都是实例方法,貌似无类方法),不要在里面定义类方法,比如计算记录的总数,查看所有记录,这些应该放在自定义的manager类中。以Django1.6为基础。

03

建模与表单的动态化设计

市面上有不少用于推进某些业务的表单设计器,例如轻流、简道云等,它们的理念是用一个很小的表单和流程,解决企业的细小业务,可以理解为问卷收集基础上的流转能力。但是,对于开发者而言,往往需要面临比这类细小业务复杂的多得多的业务流程,以及流程节点上的表单。我在该领域持续研究了三年多,这些研究有静态的,也有动态的。所有动态化,有两个角度,从产品运营人员的角度,处于流程中的表单可能随时需要调整一些策略,例如字段的限制,或者某些字段的增删;从开发人员的角度,我们不能用代码限定死表单及其囊括各方面的内容,而是需要在前后端配合下,异步的生成表单的界面、交互、业务逻辑等等。本文将梳理我的设计思路。

01
领券