多くのエンティティを持つ巨大なプロジェクトでは、私はsave()
の共通メソッドを書いていました。Zend framework 2/Doctrine 2 /バルク操作とイベントトリガー
このメソッドは、抽象サービスに格納され、エンティティの状態を保存するためにすべてのプロジェクトで使用されます。 (私の場合は
public function save($entity)
{
$transactionStarted = $this->beginTransaction();
try
{
$action = $entity->getId() ? self::UPDATE : self::CREATION;
$this->getEventManager()->trigger('save.pre', $entity, ['action' => $action]);
$this->getEntityManager()->persist($entity);
$this->getEntityManager()->flush();
$this->getEventManager()->trigger('save.post', $entity, ['action' => $action]);
if ($transactionStarted)
{
$this->commitTransaction();
}
} catch (\Exception $e)
{
if ($transactionStarted)
{
$this->rollbackTransaction();
}
throw new Exception('Unable to save entity', $e);
}
return true;
}
public function beginTransaction()
{
if (!$this->getEntityManager()->getConnection()->isTransactionActive())
{
$this->getEntityManager()->getConnection()->beginTransaction();
return true;
}
return false;
}
public function commitTransaction()
{
$this->getEntityManager()->getConnection()->commit();
return $this;
}
public function rollbackTransaction()
{
$this->getEntityManager()->getConnection()->rollBack();
return $this;
}
、メンバーが挿入されたとき(新しいMember
エンティティ)(AbstractService
を拡張)Member
サービスを呼び出すときに、電子メールが送信されます。
AbstractService ::セーブ()は次のようになります例えば、save.post
イベントを通して)。 saveメソッドを呼び出す別のサービスに関連する別のアクションも実行できます。 "子" MemberService :: save()メソッド
MemberService
public function save(Member $member)
{
// some stuff, e.g set a property
$member->setFirstName('John');
return parent::save($member);
}
簡単な保存処理のために素晴らしいことだ、トリガイベント
$sharedEventManager->attach(MemberService::class, 'save.post', [$this, 'onMembersCreation']);
public function onMembersCreation(EventInterface $event)
{
// send an email
// anything else ... update another entity ... (call AnotherService::save() too)
}
の例の
例。
しかし今、私はたくさんのメンバーを作成し、更新して大量にインポートしたいと思います。それを達成するために、一括インポートに関連するDoctrineのドキュメントを読んでいます。 Doc here
「バルク保存」と「シングルセービング」を処理するためにコードを正しく更新するにはどうすればよいですか?トランザクションのセキュリティとイベントを維持しますか?
「たくさんのメンバー」とは何ですか? 1k? 1M?あなたの答えは、あなたが助けるべき戦略を定義するでしょう – JesusTheHun
こんにちはJesusTheHun、私の問題で最初に興味を持っていただきありがとうございます:) "多くのメンバー"は4kから10kです – ceadreak
これはワンショットのインポートですか?頻繁に走る?根底にある問題は、パフォーマンスが重要かどうかです。 – JesusTheHun