我正在尝试使用批量插入优化我的学说保存。但在保存期间我收到以下错误:
通过这种关系找到了一个新的实体 '的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();
}
}
答案 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;
你也可以同时使用两者。