【Symfony】Symfony4.4でORMを使用したCRUD操作

# はじめに
SymfonyでORM(Doctrine)を使用したCRUD操作が初めてでした。忘れないためにアウトプットしようと思い記事にしました。
※分かりやすくするためにソースコードはシンプルに書いております。
※ORM(Doctrine)については軽く過去の記事で紹介しています。
参考：[Doctrineで接続しているRDBMSの名前取得(ORMの説明)](https://qiita.com/Shogongon/items/36c63586ec0e16667060#%E3%81%A1%E3%81%AA%E3%81%BF%E3%81%AB)

## ちなみにCRUD操作とは
ちなみにCRUD操作とは、データの作成(Create)、読み出し(Read)、更新(Update)、削除(Delete)の頭文字を繋げた言葉です。
参考：[CRUD(Wikipedia)](https://ja.wikipedia.org/wiki/CRUD)

# その前に
リポジトリについて記述しようかと思います。リポジトリは読み出し(Read)、更新(Update)、削除(Delete)で使用します。
リポジトリは下記サイトにこのような記述があります。
> When you query for a particular type of object, you always use what's known as its "repository". You can think of a repository as a PHP class whose only job is to help you fetch entities of a certain class.
Once you have a repository object, you have many helper methods:
> 
参考：[Symfony docs:fetching-objects-from-the-database](https://symfony.com/doc/current/doctrine.html#fetching-objects-from-the-database)

つまり、リポジトリはあるクラスの実体を取得するためのPHPクラスであり、リポジトリオブジェクトを取得して読み出しや更新、削除ができるようになります。

# CRUD
今回は商品クラス(Product)を例に書いていきます。
変数の`$id`は主キーのことです。

## データの作成(Create)
```php
$product = new Product();
$product->setName("机");
$product->setPrice(1000);
$entityManager->persist($product);
$entityManager->flush();
```

## データの読み出し(Read)
データの読み出しは方法はいくつかありますので紹介します。
また、findだけはリポジトリオブジェクトとエンティティマネージャの2パターンで読み出しができるので記述しました。

## find
findは指定した主キーのデータを取得します。
```php
// リポジトリオブジェクトを使用した場合
$productRepository = $entityManager->getRepository(Product::class);
$productRepository->find($id);

// エンティティマネージャを使用した場合
$entityManager->find(Product::class, $id);
```

## findAll
findAllは全てのデータを取得します。
```php
$productRepository = $entityManager->getRepository(Product::class);
$productRepository->findAll();
```

## findOneBy
findOneByは第一引数にカラムと値の配列を与えることでデータを取得できます。
```php
$productRepository = $entityManager->getRepository(Product::class);
$productRepository->findOneBy(array('name'=>'机'));
```

## findBy
findByは第一引数にカラムと値の配列を与えることでデータを取得できます。
また、第二引数～第四引数に値を入れることで取得できるデータが変わります。第二引数は並び順（昇順、降順）、第三引数は取得数、第四引数は何番目からデータを取得するか等です。
※第二引数～第四引数は別に値を入れなくてもよいです。
※こちらのページを参考にしました。[doctrine-project:by-simple-conditions](https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/reference/working-with-objects.html#by-simple-conditions)
```php
$productRepository = $entityManager->getRepository(Product::class);
$productRepository->findBy(array('name'=>'机'),array('price'=>'DESC'),2,2); // findBy(array("column"=>"value"), $orderBy, $limit, $offset)
```

## データの更新(Update)
```php
$productRepository = $entityManager->getRepository(Product::class);
$product = $productRepository->find($id);
$product->setName("デスク");
$entityManager->persist($product);
$entityManager->flush();
```

## データの削除(Delete)
※こちらのページが参考になります。[doctrine-project:removing-entities](https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/reference/working-with-objects.html#removing-entities)
```php
$productRepository = $entityManager->getRepository(Product::class);
$product = $productRepository->find($id);
$entityManager->remove($product);
$entityManager->flush();
```

# 参考文献
[CRUD(Wikipedia)](https://ja.wikipedia.org/wiki/CRUD)
[doctrine-project:Getting Started with Doctrine](https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/tutorials/getting-started.html#getting-started-with-doctrine)
[Symfony docs:fetching-objects-from-the-database](https://symfony.com/doc/current/doctrine.html#fetching-objects-from-the-database)
[doctrine-project:by-simple-conditions](https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/reference/working-with-objects.html#by-simple-conditions)
[doctrine-project:removing-entities](https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/reference/working-with-objects.html#removing-entities)