ベローのようなリポジトリがあります。
コードは、項目が既にテーブルにあるかどうかを最初にチェックします。
そうでない場合は、データをダウンロードしてテーブルに保存します。
すでにテーブルにある場合は、レコードを返すだけです。
ただし、テーブル内のアイテムをチェックした後、アイテムが既に存在する場合でもアイテムをダウンロードして保存しようとし、キーの競合が発生することがありますが、検索しただけで見つからなかったので、これは決して起こらないはずです。
注意事項:
- $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 を返します。 } }