gpt4 book ai didi

symfony - 检查 Doctrine 中是否存在持久化和非持久化实体

转载 作者:行者123 更新时间:2023-12-01 22:21:14 26 4
gpt4 key购买 nike

我的问题可能与 this one 重复,但我找不到任何令人满意的答案,所以我会尽量使这个答案更精确。

我正在从其他 API 构建导入服务。而且我不想在我的新数据库中有任何重复。

这里是我当前实现的一个例子:

Controller :

public function mainAction () 
{
$em = $this->getDoctrine()->getManager();

$persons_data = [
[
'first_name' => 'John',
'last_name' => 'Doe'
],
[
'first_name' => 'John',
'last_name' => 'Doe'
]
];

$array = [];

foreach($persons_data as $person_data)
{
$person = $this->get('my_service')->findOrCreatePerson($person_data);
$array[] = $person;
}

$em->flush();

return new Response();
}

一个服务函数:

public function findOrCreatePerson ($data) 
{
$em = $this->em;

$person = $em->getRepository('AppBundle:Person')->findOneBy([
'first_name' => $data['first_name'],
'last_name' => $data['last_name']
]);

if(is_null($person)) {
$person = new Person();
$person->setFirstName($data['first_name']);
$person->setLastName($data['last_name']);
$em->persist($person);
}

return $person
}

我试图让它尽可能简单。

如您所见,我只想进行一次数据库事务以获得一些性能改进。

问题是,如果我不在 findOrCreatePerson() 方法结束时刷新,对 Person 存储库的查询将找不到第一个对象,并且将在数据库中创建重复项。

我的问题很简单:我应该如何实现这样的东西?

最佳答案

这是一个memoize的工作!

// Cache
private $persons = [];

public function findOrCreatePerson ($data)
{
// Need unique identifier for persons
$personKey = $data['first_name'] . $data['last_name'];

// Already processed ?
if (isset($this->persons[$personKey])) {
return $this->persons[$personKey];
}
$em = $this->em;

$person = $em->getRepository('AppBundle:Person')->findOneBy([
'first_name' => $data['first_name'],
'last_name' => $data['last_name']
]);

if(is_null($person)) {
$person = new Person();
$person->setFirstName($data['first_name']);
$person->setLastName($data['last_name']);
$em->persist($person);
}

// Cache
$this->persons[$personKey] = $person;

return $person
}

关于symfony - 检查 Doctrine 中是否存在持久化和非持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39900778/

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