Поле формы сущности Symfony 2.0 не сохраняется - PullRequest
2 голосов
/ 06 октября 2011

У меня возникли проблемы с сохранением выделений, сделанных в поле формы объекта, с кратным = true.

Выборки выполняются при вызове $ form-> bindRequest ($ request), но не сохраняются в базе данных при вызове flush.

Вот соответствующий код контроллера:

$news_item = new News();

$form = $this->createFormBuilder($news_item)
  ->add('products', 'entity', 
        array('class' => 'AcmeDemoBundle:Product',
      'multiple' => TRUE))
  ->getForm();

$request = $this->getRequest();

if($request->getMethod() == "POST") {
  $form->bindRequest($request);
  if($form->isValid()) {
    $this->em->persist($news_item);
    $this->em->flush();
  }
}

Я проверил объект $ news_item после того, как $ form-> isValid () и счетчик ($ news_item-> getProducts ()) возвращает правильное количество элементов. Сам $ news_item сохраняется в БД, но отношение ManyToMany не сохраняется.

Вот сущности для справки (вырезано для краткости):

/**
 * @ORM\Entity
 * @ORM\Table(name="Product")
 */
class Product {
  /*
   * @ORM\Id @ORM\Column(type="integer")
   */
  protected $id;

  /**
   * @ORM\ManyToMany(targetEntity="News", inversedBy="products")
   */
  protected $news_items = null;

  public function __construct() {
    $this->news_items = new ArrayCollection();
  }

}

/**
 * @ORM\Entity
 * @ORM\Table(name="News")
 */
class News {
  /**
   * @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue
   */
  protected $id;

  /** 
   * @ORM\ManyToMany(targetEntity="Product", mappedBy="news_items")
   */
  protected $products = null;

  public function __construct() {
    $this->products = new ArrayCollection();
  }
}

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

Я думаю, что вам не хватает $product->addNewsItem($news_item) и $news_item->addProduct($product) в вашем коде, потому что в двунаправленных ассоциациях (кажется, ваш случай) вы должны обновить поля с обеих сторон.

Чтобы избежать этого, вы можете установить каскадную опцию по обе стороны от ассоциации:

@ORM\ManyToMany(targetEntity="Product", mappedBy="news_items",
   cascade={"persist", "remove"})

Таким образом, ваш код будет работать. Вы можете выбрать подходящие варианты каскада, взглянув на здесь .

0 голосов
/ 06 октября 2011

У меня нет той же проблемы, что и у вас, но мне нужно было иметь возможность загружать FixtureData, используя похожие объекты. Я получил ссылку на эту документацию: http://www.doctrine -project.org / docs / orm / 2.1 / en / reference / working-with-association.html , и я считаю, что это решит мою проблему. Я надеюсь, что это работает и для вас.

JS

...