php - 保留/刷新表单在数据库中创建了额外的行

标签 php mysql symfony

我有一个表单,其中包含从一个表创建的多行(与其他表没有关系)。当我保存表单时,我所做的每项更改都会保存,但数据库中确实有一个额外的空行。 请参阅下文(希望)了解所有必要的信息。

PropertyAdditionCostFrequency.php

/**
 * @ORM\Entity
 * @ORM\Table(name="property_addition_cost_frequency")
 */
class PropertyAdditionCostFrequency
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $label = '';

    private $costFrequencyCollection;

    public function __construct()
    {
        $this->costFrequencyCollection    = new ArrayCollection();
    }
    // + the getters and setters
}

PropertyAdditionCostFrequencyLabelType.php

class PropertyAdditionCostFrequencyLabelType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('label' )
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => PropertyAdditionCostFrequency::class,
        ));
    }
}

PropertyAdditionCostFrequencyForm.php

class PropertyAdditionCostFrequencyForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(  'cost_frequency_collection', CollectionType::class, array(
                'entry_type' => PropertyAdditionCostFrequencyLabelType::class,
                'label' => ''
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => PropertyAdditionCostFrequency::class
        ]);
    }
}

AdminCoreDataController.php

public function showCoreDataListAction( Request $request )
{
    $PropertyAdditionCostFrequency = new PropertyAdditionCostFrequency();

    $repository = $this->getDoctrine()->getRepository('AppBundle:PropertyAdditionCostFrequency');
    $cost_frequency = $repository->findAll();

    foreach ($cost_frequency as $k => $v) {
        $PropertyAdditionCostFrequency->getCostFrequencyCollection()->add($v);
    }

    $form = $this->createForm( PropertyAdditionCostFrequencyForm::class, $PropertyAdditionCostFrequency);
    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()){
        $propertyAdditionCostFrequency_form  = $form->getData();
        $em = $this->getDoctrine()->getManager();
        $em->persist($propertyAdditionCostFrequency_form);
        $em->flush();

        $this->addFlash('success', 'successfully changed the data');
        return $this->redirectToRoute('admin_core_data');
    }

    return $this->render('logged_in/content/admin/core_data/core_data.html.twig', [
        'propertyCostFrequencyForm' => $form->createView()
    ]);
}

core_data.html.twig

{{ form_start(propertyCostFrequencyForm) }}

<div class="row" id="cost_frequency_box">
    {% for single_frequency in propertyCostFrequencyForm.cost_frequency_collection %}
        <div class="row js-single-cost-frequency-box">
            <div class="col-sm-1 js-delete-cost-frequency">
                <a href="/admin/property/delete/5">
                    <i class="fa fa-trash"></i>
                </a>
            </div>
            <div class="col-sm-4">
                {{ form_widget(single_frequency.label) }}
            </div>
        </div>
    {% endfor %}
</div>
<div class="row">
    <div class="col-sm-3">
        <button class="col-sm-12 btn btn-success" type="submit">Speichern</button>
    </div>
</div>

{{ form_end(propertyCostFrequencyForm) }}

在“$em->persist($propertyAdditionCostFrequency_form)”之前的 $propertyAdditionCostFrequency_form 的 dump()

PropertyAdditionCostFrequency {#394 ▼
    -id: null
    -label: ""
    -costFrequencyCollection: ArrayCollection {#395 ▼
        -elements: array:4 [▼
      0 => PropertyAdditionCostFrequency {#422 ▼
            -id: 1
            -label: "1"
            -costFrequencyCollection: null
      }
      1 => PropertyAdditionCostFrequency {#424 ▼
            -id: 2
            -label: "2"
            -costFrequencyCollection: null
      }
      2 => PropertyAdditionCostFrequency {#425 ▼
            -id: 47
            -label: "3"
            -costFrequencyCollection: null
      }
      3 => PropertyAdditionCostFrequency {#426 ▼
            -id: 38
            -label: "4"
            -costFrequencyCollection: null
      }
    ]
  }
}

最佳答案

发生这种情况的原因从您发布的转储中可以明显看出:顶级 PropertyAdditionCostFrequency 的 id 设置为 null,因此它当然会为此创建一个新行,所以如果您只是想知道为什么它会创建一个新行,这就是你的原因:)。

另一方面,我忍不住想,你误解了 symfony 形式/学说的工作原理,除非将多个子 PropertyAdditionCostFrequency 添加到一个父 PropertyAdditionCostFrequency 是所需的效果。

如果这不是想要的效果,而您只是想创建一个表单,其中包含数据库中每个 PropertyAdditionCostFrequency 条目的表单(我不推荐这样做,因为一旦数据库变大,它就不会很高效),您可以在 Controller 内使用 createFormBuilder 方法,添加任意 CollectionType 字段(即 $builder->add('frequencies', CollectionType::class),然后创建一个数组并将 findAll() 的结果分配给一个键(键名称应对应于字段名称,在本例中为“频率”),最后将其设置为刚刚创建的表单的数据(使用 $builder->getForm() 方法获取表单,因为这就是你在 Controller 中想要的,你应该使用设置数据方法:))(P.S.这些只是粗略的指导方针,我不确定,我没有错过任何东西)

关于php - 保留/刷新表单在数据库中创建了额外的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41569507/

相关文章:

forms - Symfony DataMapper 不更新对象

html - 如何在输入复选框旁边添加图像

php - Mysql 带有子查询的单个查询或两个单独的查询

php - Laravel groupby min/max 过滤分组结果

php - htmlspecialchars() 期望参数 1 为字符串,为连接查询给出的对象

mysql - 使用 ENDSSH heredoc 为 SSH MySQL 登录创建别名

javascript - session 过期时如何处理 laravel TokenMismatchException

mysql - 将 SQL 查询转换为 MySQL 5.7.23

php - 服务器受到攻击网站logs\x80w\x01\x03\x01和HNAP1如何阻止机器人?

php - Symfony CMF Media Bundle 使图像无效;前端不重新加载缓存图像