我有一个包含多个输入更改一个数据库列的表单。例如,我有两个选择输入,两个都改变了相同的数据库列,比方说:
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
答案 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。
如果你可以描述你想要做什么,我一定能够帮助你更多:)。