2014-10-21 3 views
0

У меня есть форма с несколькими входами, меняющими один столбец базы данных. Так, например, у меня есть два выбора входов, как меняются одни и те же столбцы базы данных, скажем:Сохранение нескольких записей в базе данных

product_id: 1 
category_id: 5 

product_id: 1 
category_id: 8 

Имея это в базе данных, у меня есть два выбора входов - сначала один, чтобы обновить первую запись, а второй, чтобы обновить вторая запись.

Form builder - это всего лишь вход в петлю foreach.

И контроллер:

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

Это, однако, выдает ошибку, что переменная категория не является объектом в методе Персис.

Например, если есть один выбор входной объект данных выглядит следующим образом:

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

Можете ли вы показать нам свой источник типа формы? –

+0

Конечно, я отредактировал сообщение. – khernik

ответ

2

Первое: никогда не вызывайте функцию смыва EntityManager в цикле. Вы можете сохранить многие объекты перед использованием 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.

Если вы можете описать то, что вы пытаетесь сделать, я, безусловно, смогу помочь вам больше :).