У меня есть форма, связанная с объектом рецепта.
Этот объект рецепта имеет recipeCategories.
При изменении рецепта обновление любого поля будет работать отлично, за исключением добавления новой категории.
Моя форма:
$builder
->add('recipeCategories', 'entity',array(
'multiple' => true,
'class' => 'AppBundle:FoodAnalytics\RecipeCategory',
'label' => 'Catégories',
'required' => false,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Indiquez les catégories dans lesquelles enregistrer la recette pour un recherche future plus facile",
)))
Вот что я получаю:
exit(var_dump($request->request));
У запроса есть recipeCategories
$recipeForm->handleRequest($request);
exit(var_dump($recipeForm->getData()->getRecipeCategories()->toArray()));
Форма имеет рецептКатегории
$formManager->getEntityManager()->persist($recipe);
exit(var_dump($recipe->getRecipeCategories()->toArray()));
Рецепт имеет категории
$formManager->getEntityManager()->flush($recipe);
exit(var_dump($formManager->getEntityManager()->getUnitOfWork()->getScheduledEntityInsertions()));
С или без флеша, я получаю ноль здесь
Я использую Symfony ~ 2.6.0 и Doctrine ~ 1.3, а Composer Предпочтение-Стабильно установлено в true.
Есть идеи, что я могу сделать, чтобы это сработало? Другие поля сохраняются правильно.
Мои объекты связаны следующим образом:
/**
* @ORM\ManyToMany(targetEntity="\AppBundle\Entity\FoodAnalytics\Recipe", inversedBy="recipeCategories")
* @ORM\JoinTable(
* name="RecipeCategoryHasRecipe",
* joinColumns={@ORM\JoinColumn(name="recipeCategoryId", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="recipeId", referencedColumnName="id", nullable=false)}
* )
*/
private $recipes;
Вероятно, вам нужно установить cascade
параметр в определении вашего отношения:
/**
* @ORM\ManyToMany(targetEntity="\AppBundle\Entity\FoodAnalytics\Recipe", inversedBy="recipeCategories", cascade={"persist"})
* @ORM\JoinTable(
* name="RecipeCategoryHasRecipe",
* joinColumns={@ORM\JoinColumn(name="recipeCategoryId", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="recipeId", referencedColumnName="id", nullable=false)}
* )
*/
private $recipes;
Я понял!
Я думал, что определение by_reference => false в форме было только для коллекций, но это также имеет место здесь. Мне пришлось добавить следующий код:
/**
* Add recipeCategory
*
* @param RecipeCategory $recipeCategory
*
* @return Recipe
*/
public function addRecipeCategory(RecipeCategory $recipeCategory)
{
$recipeCategory->addRecipe($this); //makes the difference
$this->recipeCategories[] = $recipeCategory;
return $this;
}