1

ベローのようなリポジトリがあります。

コードは、項目が既にテーブルにあるかどうかを最初にチェックします。

  • そうでない場合は、データをダウンロードしてテーブルに保存します。

  • すでにテーブルにある場合は、レコードを返すだけです。

ただし、テーブル内のアイテムをチェックした後、アイテムが既に存在する場合でもアイテムをダウンロードして保存しようとし、キーの競合が発生することがありますが、検索しただけで見つからなかったので、これは決して起こらないはずです。

注意事項:

  1. $query->useResultCache(true) を無効にしても問題ありません。
  2. これは、テーブルで機能する唯一のプロセスです。
  3. これは、アイテムがテーブルに追加されるコード内の唯一の場所です。
  4. このコードは、symfony2 コンソール コマンドから呼び出されています。
  5. Memcache は doctrine2 の設定キャッシュです。
  6. Memcached はローカルで実行されています。
  7. arraycache を使用した場合にもエラーが発生します。
  8. このクエリは、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 を返します。
      }
    }
4

1 に答える 1