次のコードがあるとします。
while (true)
{
foreach($array as $row)
{
$item = $em->getRepository('reponame')->findOneBy(array('filter'));
if (!$item)
{
$needPersist = true;
$item = new Item();
}
$item->setItemName()
// and so on ...
if ($needPersist)
{
$em->persist();
}
}
$em->flush();
}
したがって、ポイントは、コードが何度も実行されることです(サーバーは停止しません:))。そして、それを最適化したいのです。毎回:
- リポジトリから既にエントリを選択します。
- エントリが存在しない場合は作成します。
- それに新しい(更新)変数を設定します。
- アクションを適用します (フラッシュ)。
質問は - 不要なクエリを回避し、「エントリが存在するかどうかを確認する」を最適化する方法は? 100 から 500 のクエリがある場合、それほど怖くはありません... しかし、1 回の while ループで 1000 から 10000 になると、多すぎます。
PS: DB の各エントリは、(ID だけでなく) いくつかの列によって一意です。