首页 > 解决方案 > Symfony 学说批量插入

问题描述

我正在尝试使用批量插入优化我的学说保存。但是在保存过程中出现以下错误:

通过关系“AppBundle\Entity\Product#category”找到了一个新实体,该实体未配置为对实体进行级联持久化操作:AppBundle\Entity\Category@00000000351492f00000000072328419。要解决此问题:在此未知实体上显式调用 EntityManager#persist() 或配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行“AppBundle\Entity\Category#__toString()”以获得线索。

我的类别实体:

class Category
{

    /**
     * @var string
     *
     * @ORM\Id()
     * @ORM\Column(type="string", nullable=false, unique=true)
     * @ORM\GeneratedValue(strategy="UUID")
     */
    private $id;

    /**
     * @var Category
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)
     */
    private $parent;

    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Category", mappedBy="parent", fetch="EAGER")
     */
    private $children;

    /**
     * @var ArrayCollection;
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Product", mappedBy="category", fetch="EAGER")
     */
    private $products;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=false)
     */
    private $title;
}

我的产品实体:

class Product
{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=false)
     */
    protected $category;

    /**
    * @ORM\Column(type="integer",nullable=true)
    */
    private $stock;

}

我的保存方法:

$em = $this->getDoctrine()->getManager();
$batchCount = 10;
for ($i = 0; $i < 10000; $i++) {
     $product = new Product();
     $product->setName("Product A");
     $product->setCategory("category A");
     $em->persist($product);
     if (($i % $batchCount) == 0) {
         $em->flush();
         $em->clear();
    }
}

标签: phpsymfonydoctrine

解决方案


首先在您的代码中:

$product->setCategory("category A");

你不能有这个,因为它应该需要对象,但我会假设你为了提问而简化了你的代码。

您的问题是您将关联添加到产品,但您没有将关联添加到您的类别实体。

这通常有两种解决方案:

// In your Product entity add cascade persist, this will check your categories as well and schedule them for persist during flush
/**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="products", cascade={"persist"})
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=false)
 */
protected $category;

下一个解决方案(我更喜欢这个,因为你可以随时控制一切)。

// In your product entity set Category
public function setCategory(Category $category) {
    $this->category = $category;
    $category->addProduct($this);
}

// In you Category entity
public function addProduct(Product $product) {
    if (!$this->products->contains($product)) {
        $this->product->add($product);
    }
}

您也可以同时使用两者。


推荐阅读