php - 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();
}
}
解决方案
首先在您的代码中:
$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);
}
}
您也可以同时使用两者。
推荐阅读
- python - 如果列表作为 y 传递,Keras 中 y_true 的形状是什么?
- r - 在 R 中的字符串上使用 If / Else if 时出现错误
- python - 如何在数据框中找到另一个没有循环的相关行
- css - 链接和文本的 CSS 位置集中在特定的屏幕尺寸/分辨率上
- r - 如何计算更快的月度加权平均值
- php - 刚刚升级了 Bitnami WAMP 堆栈,现在我的 PHP 文件正在忽略文件更改
- python - 连接字符串的 Pandas keyerror
- macos - “更改目录”命令在 Mac 终端中不起作用
- angular - 即使在召回功能角度上,循环也不会停止
- docker - 从 git 克隆的构建代码在 dockerfile 中失败