ベローのようなリポジトリがあります。
コードは、項目が既にテーブルにあるかどうかを最初にチェックします。
そうでない場合は、データをダウンロードしてテーブルに保存します。
すでにテーブルにある場合は、レコードを返すだけです。
ただし、テーブル内のアイテムをチェックした後、アイテムが既に存在する場合でもアイテムをダウンロードして保存しようとし、キーの競合が発生することがありますが、検索しただけで見つからなかったので、これは決して起こらないはずです。
注意事項:
- $query->useResultCache(true) を無効にしても問題ありません。
- これは、テーブルで機能する唯一のプロセスです。
- これは、アイテムがテーブルに追加されるコード内の唯一の場所です。
- このコードは、symfony2 コンソール コマンドから呼び出されています。
- Memcache は doctrine2 の設定キャッシュです。
- Memcached はローカルで実行されています。
- arraycache を使用した場合にもエラーが発生します。
- このクエリは、1 秒間に何度も実行されます。
クラス ItemRepository は EntityRepository を拡張します
{
パブリック関数 findOrFetch($id)
{
$item = $this->findItem($id);
if($item != null)
$アイテムを返します。
そうしないと
{
$itemData = $this->fetchItem($id);
$item = 新しいアイテム();
$item->setId($id);
$item->setName($itemData['name']);
$this->getEntityManager()->persist($item);
$this->getEntityManager()->flush();
}
}
プライベート関数 findItem($id)
{
$クエリ = $これ
->getEntityManager()
->createQuery('SELECT i from MonkeyWire\WowProfToolsBundle\Entity\Item i WHERE i.id = ?1');
$query->setParameter(1, $id);
$query->useResultCache(true);
$query->getOneOrNullResult(); を返します。
}
プライベート関数 fetchItem($id)
{
$api = 新しいクライアント();
$api->setRequest(新しい Curl());
試す
{
$itemData = $api->getItemsApi()->getItem($id);
}
キャッチ (NotFoundException $e)
{
$itemData['name'] = "な";
}
$itemData を返します。
}
}