Symfony主义批量插入

时间:2018-05-28 22:19:26

标签: php symfony doctrine

我正在尝试使用批量插入优化我的学说保存。但在保存期间我收到以下错误:

  

通过这种关系找到了一个新的实体   '的appbundle \实体\产品类别#'没有配置为级联   坚持实体运营:   的appbundle \实体\目录@ 00000000351492f00000000072328419。要解决   此问题:在此显式调用EntityManager#persist()   未知实体或配置级联持久化此关联   映射例如@ManyToOne(..,cascade = {" persist"})。如果你不能   找出导致问题实施的实体   '的appbundle \实体\类别#__的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();
    }
}

1 个答案:

答案 0 :(得分:1)

代码中的第一个:

#define CALL(f) Call<decltype(f()), f>

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

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

这通常有两种解决方案:

$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;

你也可以同时使用两者。