教义2:在一对多的双向关系中,如何从反面保存?

2022-01-16 00:00:00 php symfony doctrine doctrine-orm

我有下面的一对多双向关系.

I have the One-to-Many bidirectional relationship below.

使用 symfony2 任务生成 crud 操作后,当我尝试在新/编辑类别表单中保存与类别关联的产品时,产品未保存...

After generating the crud actions with a symfony2 task, when I try to save the Products associated to a Category in the new/edit Category form, the products are not saved...

namespace PruebaFrontendBundleEntity;

use GedmoMappingAnnotation as Gedmo;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;

/**
 * @ORMEntity
 * @ORMTable(name="category")
 */
class Category
{

    /**
     * @var integer $id
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @ORMColumn(name="name")
     */
    protected $name;

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

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function __toString()
    {
        return $this->name;
    }

    public function getProducts()
    {
        return $this->products;
    }

    public function setProducts($products)
    {
        die("fasdf"); //here is not entering
        $this->products[] = $products;
    } 

    public function addProduct($product)
    {
        die("rwerwe"); //here is not entering
        $this->products[] = $product;
    } 
}

namespace PruebaFrontendBundleEntity;

use GedmoMappingAnnotation as Gedmo;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;

/**
 * @ORMEntity
 * @ORMTable(name="product")
 */
class Product
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORMManyToOne(targetEntity="Category", inversedBy="products")
     * @ORMJoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;

    /**
     * @ORMColumn(type="string", length=100)
     */
    protected $name;


    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name =  $name;
    }

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

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

    public function __toString()
    {
        return $this->name;
    }
}

推荐答案

由于它是双向的,你需要更新双方的关联.

As its bidirectional you need to update the association on both sides.

将此函数添加到Category Entity中(如果你喜欢,你可以称它为addChild):

Add this function into the Category Entity (you can call it addChild if you like):

public function addProduct($product)
{
    $this->children->add($product);
}

然后同时更新两个关联:

And then update both associations at the same time:

public function setProductCategory($product_category)
{
    $this->productCategory = $product_category;  
    $product_category->addProduct($this);
}

提示:不要使用 $children/$parent 来描述实体.将其称为 $category/$product,当您想添加另一个父"关系时会遇到问题.

Tip: Dont use $children / $parent to describe Entities. Call it what it is $category / $product, you'll run into issues when you want to add in another "parent" relationship.

相关文章