私はSymfony2とDoctrine2で少し遊んでいます。
たとえば、一意のタイトルを持つエンティティがあります。
class listItem
{
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @orm:Column(type="string", length="255", unique="true")
* @assert:NotBlank()
*/
protected $title;
今、私はjsonをフェッチし、それらのアイテムでデータベースを更新しています:
$em = $this->get('doctrine.orm.entity_manager');
foreach($json->value->items as $item) {
$listItem = new ListItem();
$listItem->setTitle($item->title);
$em->persist($listItem);
}
$em->flush();
初めて正常に動作します。しかし、2回目はSQLエラーが発生します(もちろん):Integrity constraint violation: 1062 Duplicate entry
時々私のjsonファイルが更新され、いくつかのアイテムは新しいものもあれば、そうでないものもあります。重複ファイルをスキップして新しいファイルを挿入するようにエンティティマネージャーに指示する方法はありますか?
これを行うための最良の方法は何ですか?
すべての助けをありがとう。不明な点がある場合はコメントを残してください
編集:
私にとってうまくいくのは、次のようなことです。
$uniqueness = $em->getRepository('ListItem')->checkUniqueness($item->title);
if(false == $uniqueness) {
continue;
}
$listItem = new ListItem();
$listItem->setTitle($item->title);
$em->persist($listItem);
$em->flush();
}
checkUniqueness
タイトルがすでにデータベースにあるかどうかをチェックするListItemリポジトリのメソッドです。
それはひどいです。これは、アイテムごとに2つのデータベースクエリです。これにより、このアクションに対する約85のデータベースクエリが発生します。