【问题标题】:Symfony submit button doesn't flush/update the entity properlySymfony 提交按钮无法正确刷新/更新实体
【发布时间】:2018-01-22 19:21:42
【问题描述】:

我的实体“公司”与

有两个多对多关系
  1. 实体“用户”和
  2. 实体“机构”

相关数据,我想显示为带有 EntityType-dropdown 的表格以(取消)选择数据。 因此,我有以下形式:

$builder
    ->add('usercorporations', EntityType::class, array(
      'class' => 'UserBundle:User',
      'query_builder' => function (EntityRepository $er) use ($corporationMarket) {
        return $er->createQueryBuilder('e')
        ->andWhere(':marketIds MEMBER OF e.markets')
        ->setParameter('marketIds',$corporationMarket)
        ->orderBy('e.lastName', 'ASC');
      },
      'choice_label' => function($user) {
        return $user->getFirstName() . ' ' . $user->getLastName() ;
      },
      'expanded' => false, 'multiple' => true,
      'required'=>false,
      'by_reference' => false,
      'empty_value' => "label.select_user",
      'translation_domain' => 'Agency'))

  ->add('agencies', EntityType::class, array(
   'class' => 'AppBundle:Agency',
   'query_builder' => function (EntityRepository $er){
   return $er->createQueryBuilder('a')
   ->addOrderBy('a.account', 'ASC');
   },
   'label' => 'label.agencies',
   'choice_label' => function($agency) {
     return $agency->getId() . ' - ' . $agency->getAccount() . ' - ' . $agency->getCityName() . ', ' . $agency->getState();
   },
   'expanded' => false, 'multiple' => true,
   'required' => false,
   'translation_domain' => 'Agency',
  ));

我的 twig 模板包括两个下拉列表以及每个实体的两个表格。

      {{ form_start(form) }}
  {# This renders a red banner if the form contains errors.
    If the form variable is not called "form", pass it explicitly. #}
  {% include 'Form/form_errors_banner.html.twig' %}
  <div class="row">
    <div class="col-md-12">
      <div class="panel panel-default">
        <div class="panel-body">
          <legend>{{ 'label.assignedUsers'|trans }}</legend>
          {{ form_widget(form.usercorporations) }}
          <br>
          <br>
          {% include 'UserBundle:User:AssignedUsers.html.twig' %}
        </div>
      </div>
    </div>
    <div class="col-md-12">
      <div class="panel panel-default">
        <div class="panel-body">
          <legend>{{ 'label.assignedAgencies'|trans }}</legend>
          {{ form_widget(form.agencies) }}
          <br>
          <br>
          {% include 'AppBundle:Agency:AssignedAgencies.html.twig' with {'entity': corporation} %}
        </div>
      </div>
    </div>
    <div>
      <input type="submit" class="btn-primary btn" value="{{ 'label.apply'|trans }}"/>
    </div>
    {{ form_end(form) }}

  </div>

我也在其他页面上使用表(AssignedUsers 和 AssignedAgencies),一切正常。

所以现在我的问题是: 我希望能够简单地添加和删除用户或代理商。通过取消选择例如下拉列表中的用户,然后提交,它正在工作,用户不再分配给公司。不知何故,同样的程序对这些机构不起作用。我不知道为什么,我在刷新之前和之后转储了数据并且它正在转储正确的数据,但是当我返回公司时,没有任何改变。 我的控制器操作:

/**
 * @Route("/corporation/{id}/{page}", name="appBundle_corporation", requirements={"id" = "\d+",  "page" = "\d+"}, defaults={"page" = 1}))
 */
public function corporationAction($id, Request $request, $page)
{
  $repository = $this->getDoctrine()
    ->getRepository('AppBundle:Corporation');
  $em = $this->getDoctrine ()->getManager ();
  $corporation = $repository->findOneById($id);
  /*
  * CREATE PAGINATION FOR TABLES
  */
  //assigned Users
  $assignedUsers = $corporation->getUsercorporations();

  $assignedAgencies = $corporation->getAgencies();

  dump($assignedAgencies);

  $form = $this->createForm(CorporationAssignmentType::class,$corporation, array(
    'corporationMarket' => $corporationMarket,
  ));
  $form->handleRequest($request);

  if ($form->isSubmitted() && $form->isValid()) {
    $em->persist($corporation);
    $em->flush();
  dump($assignedAgencies);
    $this->addFlash(
      'success',
      'Your changes were saved!'
    );
    return $this->redirectToRoute('appBundle_corporation', array('id' => $corporation->getId()));
  }

  return $this->render('AppBundle::corporation.html.twig', array(
    'item' => $corporation,
    'corporation'=>$corporation,
    'assignedUsers'=>$userTable,
    'assignedAgencies' => $agencyTable,
    'form' => $form->createView(),
  ));
}

任何想法为什么它会刷新用户而不是代理商?

【问题讨论】:

    标签: forms symfony entity submit flush


    【解决方案1】:

    我以这种方式解决了我的问题,但@ASOlivieri 的回答可能对我有很好的帮助。 我最初做的是:

    在实体机构中

      /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Corporation", inversedBy="agencies", cascade={"persist"})
     * @ORM\JoinTable(name="app_agency_corporations",
     *   joinColumns={@ORM\JoinColumn(name="agency_id", referencedColumnName="iata8")},
     *   inverseJoinColumns={@ORM\JoinColumn(name="corporation_id", referencedColumnName="ucid")})
     * @var \AppBundle\Entity\Corporation
     **/
    private $corporations;
    

    在实体公司中

    /**
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Agency", mappedBy="corporations")
    **/
    private $agencies;
    

    当切换它时 --> 代理的财产公司的较短代码和关于 JoinTable 等的较长代码到它工作的公司的财产代理。

    如果有人可以向我解释为什么这是解决方案,我会很高兴!

    【讨论】:

      【解决方案2】:

      如果您的实体在其他地方工作(其他控制器等),那么我怀疑您必须在agencies 表单选项中将by_reference 设置为 false。

      ->add('agencies', EntityType::class, array(
         'class' => 'AppBundle:Agency',
         'query_builder' => function (EntityRepository $er){
         return $er->createQueryBuilder('a')
         ->addOrderBy('a.account', 'ASC');
         },
         'label' => 'label.agencies',
         'choice_label' => function($agency) {
           return $agency->getId() . ' - ' . $agency->getAccount() . ' - ' . $agency->getCityName() . ', ' . $agency->getState();
         },
         'expanded' => false, 'multiple' => true,
         'required' => false,
         'by_reference' => false,
         'translation_domain' => 'Agency',
        ));
      

      它看起来好像在您的 user 表单选项中设置的那样。

      【讨论】:

      • 谢谢@ASOlivieri。我现在真的不知道如何处理答案,因为我用不同的解决方案解决了它,但你的解决方案可能也有帮助?你有什么建议?你知道为什么我的解决方案有帮助吗?
      • 我不知道为什么。但我怀疑这是 Doctrine 方面的惰性加载和急切加载之间的区别。很高兴它已修复。
      猜你喜欢
      • 2014-12-09
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2019-02-09
      • 2017-07-31
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      相关资源
      最近更新 更多