【问题标题】:Symfony2.1 entity field type multiple expanded not savingSymfony2.1实体字段类型多扩展不保存
【发布时间】:2013-03-27 16:05:20
【问题描述】:

在 Symfony 2.1 中使用实体字段类型时,我遇到了一些双向关系(一对多)问题。在创建子(产品)并选择父(类别)时,一切都是 hunky dory,它按预期创建和持久化。当创建父级(类别)并选择由 Symfony2 的表单系统生成的多个子级(产品)复选框时,就会出现问题。 这不会持续存在

我将把我的示例类放在下面,但是克隆我的示例项目 repo 可能更容易 - https://github.com/domudall/multiple-expanded-entity-choice-issue

类别

class Category
{
    protected $id;
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    protected $products;

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

    public function addProduct($product)
    {
        if (!$this->products->contains($product)) {
            $this->products->add($product);
            $product->setCategory($this);
        }

        return $this;
    }

    public function setProducts($products)
    {
        foreach ($products as $product) {
            $this->addProduct($product);
        }

        return $this;
    }

    public function removeProducts()
    {
        if ($this->products->contains($product)) {
            $this->products->remove($product);
        }

        return $this;
    }
}

产品

class Product
{
    protected $id;
    protected $name;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     */
    protected $category;

    public function setCategory(Category $category)
    {
        $this->category = $category;
        $category->addProduct($this);

        return $this;
    }

    public function getCategory()
    {
        return $this->category;
    }
}

默认控制器

class DefaultController extends Controller
{
    public function categoryCreateAction(Request $request)
    {
        $category = new Category();

        $form = $this
            ->createFormBuilder($category)
            ->add('name', 'text', array())
            ->add('products', 'entity', array(
                'class' => 'AcmeShopBundle:Product',
                'property' => 'name',
                'required' => false,
                'expanded' => true,
                'multiple' => true,
            ))
            ->getForm();

        if ($request->getMethod() == 'POST') {
            $this->save($category, $form, $request);
        }
    }

    public function productCreateAction(Request $request)
    {
        $product = new Product();

        $form = $this
            ->createFormBuilder($product)
            ->add('name', 'text')
            ->add('category', 'entity', array(
                'class' => 'AcmeShopBundle:Category',
                'property' => 'name',
                'required' => false,
            ))
            ->getForm();

        if ($request->getMethod() == 'POST') {
            $this->save($product, $form, $request);
        }
    }

    protected function save($entity, $form, $request)
    {
        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();
        }
    }
}

任何指向我哪里出错的指针将不胜感激。

注意

我不想使用 Doctrine cascade 选项,而是希望实体中的逻辑与数据库分开进行单元测试。

【问题讨论】:

  • mappedBy 端是不可变的。您将不得不手动持久化 Product 对象。

标签: php doctrine-orm symfony-2.1 symfony-forms


【解决方案1】:

如果您不想级联,则必须手动持久化这些实体。

我使用集合的map() 方法(如下),但您可以通过集合的toArray() 方法使用foreacharray_map

试试下面的控制器代码:

protected function saveCategory($category, $form, $request)
{
    $form->bind($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();           
        $entity->getProducts()->map(
            function($product) use ($em) {
                $em->persist($product);
            }
        );

        $em->persist($category);
        $em->flush();
    }
}

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 2017-10-22
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2020-06-26
    相关资源
    最近更新 更多