EC-CUBE4　管理画面のCRUD　脱初心者三歩目　其ノ二　Repository編

#はじめに
前回の[Entity編](https://qiita.com/dev_belltzel/items/8752c6ee578a2685c776)に続き、Repository編をやっていきます。

Entityはテーブルの設計図で、Repositoryを使ってテーブルからデータを取得する。
そんな感じだと思います。

Entity一つに対してRepositoryを一つ作りましょう。

#Repositoryの作成

参考にする本体ソース：[Eccube/Entity/CartRepository](https://github.com/EC-CUBE/ec-cube/blob/4.0/src/Eccube/Repository/CartRepository.php)

`CartRepository`は一番シンプルな形で、基本的にはこの形でRepositoryを用意すればOKです。

それでは、前回作成した`Customize\Entity\Agency.php`を見てみましょう。
アノテーションで`@ORM\Entity(repositoryClass="Customize\Repository\AgencyRepository")`が設定しています。

`CartRepository`を参考に`Customize\Repository\AgencyRepository.php`を作成しましょう。

```php:Customize\Repository\AgencyRepository.php
namespace Customize\Repository;

use Customize\Entity\Agency;
use Symfony\Bridge\Doctrine\RegistryInterface;

/**
 * AgencyRepository
 */
class AgencyRepository extends AbstractRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Agency::class);
    }
}
```

まずは、上記ファイルを設置するだけでOKです。

#使い方
##インジェクション
まずはインジェクションします。
「Symfony　コンストラクタインジェクション」などで調べてみてください。

例として[Eccube/Controller/Admin/Customer/](https://github.com/EC-CUBE/ec-cube/blob/e20433c5645299d6f83b66f3e129d1c49dfda398/src/Eccube/Controller/Admin/Customer/CustomerDeliveryEditController.php#L36)を見てみます。

```php
public function __construct(
    CustomerAddressRepository $customerAddressRepository
    ) {
    $this->customerAddressRepository = $customerAddressRepository;
}
```

`CustomerAddressRepository`を読み込んでいますね。（表現が正しいのか不明）

##データの取得

`find` `findAll` `findBy` `findOneBy`といった関数でデータを取得できます。
利用されてる部分を抜き出してみましょう。

```php
// find
$Product = $this->productRepository->find($id);

// findAll
$Deliveries = $this->deliveryRepository->findAll();

// findBy
$ClassCategories1 = $this->classCategoryRepository->findBy(['ClassName' => $ClassName1], ['sort_no' => 'DESC']);

// findOneBy
$Delivery = $this->deliveryRepository->findOneBy([], ['sort_no' => 'DESC']);
```

`find`はidを指定してやり、一つのデータを取得します。
上記例では、IDを指定して商品データを取得しています。

`findAll`はすべてのデータを取得します。
配送方法のデータをすべて取得します。

`findBy`はwhere条件とorderBy条件を指定してデータを取得します。
引数１にwhere条件の配列、引数２にOrderBy条件の配列を指定し、条件に合ったデータを配列で複数取得します。

`findOneBy`は`findBy`と同じでwhere条件とorderBy条件を指定してデータを取得します。
`findBy`と違う部分は、最初のデータを一つだけ、配列データではなく、オブジェクトデータで取得します。

##createQueryBuilderを使う

参考例：[Eccube/Controller/Admin/Product/ProductClassController::findProduct()](https://github.com/EC-CUBE/ec-cube/blob/e20433c5645299d6f83b66f3e129d1c49dfda398/src/Eccube/Controller/Admin/Product/ProductClassController.php#L436)

findByはwhereとOrderBy条件だけでしたが、createQueryBuilder()を使い、自由度の高い条件でデータを取得する事ができます。

チェーンメソッドで`->getQuery()` `->getResult()`と続けてデータを取得します。

`getResult()`は他にも`getSingleResult()` `getSingleScalarResult()` `getArrayResult()`があります。

これらも配列だったりオブジェクトだったりが取得できます。
`getSingleScalarResult()`はcountした時、数値が取得できます。

#Repositoryに関数を作成

一番シンプルな形でRepositoryを作成しましたが、[Eccube/Repository](https://github.com/EC-CUBE/ec-cube/tree/4.0/src/Eccube/Repository)のファイルを見て回ると、関数が結構作られています。

例えば、[Eccube/Repository/ProductRepository::getQueryBuilderBySearchDataForAdmin()](https://github.com/EC-CUBE/ec-cube/blob/e20433c5645299d6f83b66f3e129d1c49dfda398/src/Eccube/Repository/ProductRepository.php#L216)は、管理画面の商品一覧で検索された時の条件で絞り込む処理になっています。

Controllerに書くと長くなってしまうので、データ取得に関わる処理はRepositoryに書いてたりします。

AgencyRepositoryも、後々、検索処理などを実装していきます。

#最後に

Repository編は以上で終わりです。

データの取得、createQueryBuilderを使うでは、EC-CUBEの本体でよく使われている処理で、紹介した使い方をマスターしておけば、十分ではないかと思います。

紹介した関数以外も用意されているっぽいのですが、今の所、僕は使った事はないです。

次回は、FormType編を書きます。お楽しみに！！