gpt4 book ai didi

doctrine-orm - Doctrine 2 重复检测

转载 作者:行者123 更新时间:2023-12-01 02:37:52 25 4
gpt4 key购买 nike

我正在尝试创建脚本,将关键字从图像导入数据库。关键字表中的关键字应该是唯一的,但许多图像可以共享相同的关键字。所以我写了这两个简单的模型:

图片:

class Image
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private $id;

/** @ORM\Column(unique=true, nullable=false) */
private $filename;

/**
* @ORM\ManyToMany(targetEntity="Keyword", inversedBy="images", cascade={"persist"})
* @ORM\JoinTable(name="image_keyword_binder")
*/
private $keywords;

public function __construct()
{
$this->keywords = new \Doctrine\Common\Collections\ArrayCollection();
}
}

关键词:
class Keyword
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
private $id;

/**
* @ORM\Column(type="string", nullable=false, unique=true)
*/
private $text;

/**
* @ORM\ManyToMany(targetEntity="Image", mappedBy="keywords")
*/
private $images;

public function __construct()
{
$this->images = new \Doctrine\Common\Collections\ArrayCollection();
}
}

现在,在导入过程中,对于每张图像,我只想将新关键字添加到数据库中,如果图像是用现有关键字描述的,我想添加对此现有关键字的引用。我想实现这样的代码:
$images[] = array('filename'=>'image1.jpg', 'keywords'=>array('blue', 'green', 'yellow'));
$images[] = array('filename'=>'image2.jpg', 'keywords'=>array('pink', 'green', 'yellow'));
$images[] = array('filename'=>'image2.jpg', 'keywords'=>array('black', 'green', 'red'));

foreach($images as $img)
{
$image = new \FL\Entity\Image();
$image->setFilename($image['filename']);
$image->setKeywords($image['keywords']);

// em is Entity Manager Instance
$em->persist($image);
$em->flush();
}

要知道的另一件事是我不想在每个循环中都进行冲洗。我将使用类似这里描述的东西: http://readthedocs.org/docs/doctrine-orm/en/latest/reference/batch-processing.html在批量插入部分。

这一切都可能吗? Doctrine 是否可以确定某个关键字是否存在并自动仅添加引用?在每个循环中从数据库加载所有现有关键字并将它们与从图像加载的新关键字进行比较不是解决方案。

最佳答案

Doctrine2 目前不支持这一点。您必须通过以下方式使用您的存储库

$image = $repository->findOneBy(array('filename' => $checkedFileName));
if ($image) {
// use reference
} else {
// create new entity instance
}

如果您愿意,也可以使用 DQL,但这是最快的方法。
所以是的,你会有很多开销。
你可以做的来减少它是建立大块尚未持久化的实体,使用 IN(:fileNames)条件,因此将每个批处理块的查询数量减少到一个。
无论如何,支票仍然取决于您。

关于doctrine-orm - Doctrine 2 重复检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com