Meine Frage könnte ein Duplikat von this one sein, aber ich kann keine befriedigende Antwort finden, also werde ich versuchen, dies genauer zu machen.Überprüfen Sie die Existenz in Doctrine für persistente und nicht persistente Entitäten
Ich baue einen Import-Service von einer anderen API. Und ich möchte kein Duplikat in meiner neuen Datenbank.
So, hier ein Beispiel meiner aktuellen Implementierung:
Der 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();
}
Eine Servicefunktion:
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
}
Ich habe versucht, es so einfach wie möglich zu machen.
Wie Sie sehen können, möchte ich nur eine DB-Transaktion machen, um einige Leistungsverbesserungen zu erhalten.
Problem ist, wenn ich nicht am Ende der findOrCreatePerson()
Methode flush, wird die Abfrage an die Person
Repository das erste Objekt nicht finden und wird Duplikate in der Datenbank erstellen.
Meine Frage ist einfach: Wie soll ich so etwas umsetzen?
Große Sache zu wissen, danke! – Hammerbot