将多个记录保留到数据库中

时间:2014-10-21 11:04:27

标签: php symfony

我有一个包含多个输入更改一个数据库列的表单。例如,我有两个选择输入,两个都改变了相同的数据库列,比方说:

product_id: 1
category_id: 5

product_id: 1
category_id: 8

在数据库中有这个,我有两个选择输入 - 第一个用于更新第一个记录,第二个用于更新第二个记录。

表单构建器只是foreach循环中的输入。

控制器:

    $data = $form->getData();
    foreach($data as $category)
    {
        var_dump($category);
        $em->persist($category);
        $em->flush();
    }

然而,这会抛出一个错误,即类别变量不是persis方法中的对象。

例如,如果有一个选择输入,则数据对象如下所示:

array (size=2)
  0 => 
    object(MyBaze\AdminBundle\Entity\ProductCategory30)[444]
      private 'productId' => int 53655
      private 'categoryId' => int 294
  'categoryId' => int 293

它也不起作用。

我该如何解决这个问题?

EDIT。

<?php

// ...

class ChangeProductCategoryType extends AbstractType
{

    /**
     * @var int $categoriesCount
     */
    private $categoriesCount = 0;

    /**
     * @var array $choices
     */
    private $choices = [];

    /**
     * @var array $currentCategories
     */
    private $currentCategories = [];

    /**
     * Initialize basic variables
     *
     * @param $categoriesCount
     */
    public function __construct($categoriesCount, $choices, $currentCategories)
    {
        $this->categoriesCount = $categoriesCount;
        $this->choices = $choices;
        $this->currentCategories = $currentCategories;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $categoriesArray = [];
        foreach($this->choices as $category)
        {
            $categoriesArray[$category['id']] = $category['name'];
        }

        for($i = 0; $i < $this->categoriesCount; $i++)
        {
            $builder->add('categoryId', 'choice', [
                'required' => false,
                'choices' => $categoriesArray,
                'empty_value' => false,
                'label' => 'Product category',
                'data' => $this->currentCategories[$i]->getCategoryId()
            ]);
        }
    }

    public function getName()
    {
        return 'changeProductCategory';
    }

} // End ChangeProductCategoryType

1 个答案:

答案 0 :(得分:2)

首先:永远不要在循环中调用EntityManager flush函数。在使用flush()之前,您可以持久化多个对象。使用几次刷新会导致性能严重不足。

而不是:

$data = $form->getData();
foreach($data as $category)
{
    var_dump($category);
    $em->persist($category);
    $em->flush();
}

你应该:

$data = $form->getData();
foreach($data as $category)
{
    // Your business with $category
    $em->persist($category);
}
$em->flush();

我完全不了解您对表单构建器的意图,但我认为这会对您有所帮助:http://symfony.com/doc/current/reference/forms/types/collection.html

如果你可以描述你想要做什么,我一定能够帮助你更多:)。