Prisma　モデルクエリチートシート

## モデルクエリ一覧

| 関数 | 役割 | 返り値 |
| - | - | - |
| findUnique | 1件のレコードを取得する。見つからない場合はnullを返す | 型付きオブジェクト |
| findUniqueOrThrow | 1件のレコードを取得する。見つからない場合は例外を投げる | 型付きオブジェクト |
| findFirst | 1件のレコードを取得する。見つからない場合はnullを返す | 型付きオブジェクト |
| findFirstOrThrow | 1件のレコードを取得する。見つからない場合は例外を投げる | 型付きオブジェクト |
| findMany | 複数件のレコードを取得する。見つからない場合は空配列を返す | 型付きオブジェクトの配列 |
| create | 1件のレコードを作成する | 型付きオブジェクト |
| update | 1件のレコードを更新する | 型付きオブジェクト |
| upsert | 1件のレコードを更新する。ない場合はレコードを追加する | 型付きオブジェクト |
| delete | 1件のレコードを削除する | 型付きオブジェクト |
| createMany | トランザクションで複数件のレコードを作成する | 作成されたレコードのカウント |
| updateMany | トランザクションで複数件のレコードを更新する | 更新されたレコードのカウント |
| deleteMany | トランザクションで複数件のレコードを削除する | 削除されたレコードのカウント |
| count | レコードの件数を取得する | レコードの件数 |
| aggregate | tableの数値フィールの集約、要約情報。欲しい情報を指定する。 | 集計値 |
| groupBy | 指定条件を付けたtableの数値フィールの集約、要約情報。欲しい情報を指定する。| 集計値 |

### 参考

https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#model-queries

## モデルクエリオプション

モデルクエリのオプションには以下の種類があります。

- select
- include
- where
- orderBy
- distinct

### select

selectはモデルの返り値のフィールドを指定することができます。

index.d.tsで型の上書きとセットで使います。

指定はbooleanで行います。

```ts
const result = await prisma.user.findUnique({
  where: { id: 1 },
  select: {
    name: true,
    profileViews: true,
  },
})

// {
//   name: "Alice",
//   profileViews: 0
// }
```

### include

includeはモデルの返り値に関係する別テーブルのレコードを含めるように指定することができます。

```ts
const users = await prisma.user.findMany({
  include: {
    posts: true, // Returns all fields for all posts
    profile: true, // Returns all Profile fields
  },
})

const user = await prisma.user.create({
  data: {
    email: 'alice@prisma.io',
    posts: {
      create: [
        { title: 'This is my first post' },
        { title: 'Here comes a second post' },
      ],
    },
  },
  include: { posts: true }, // Returns all fields for all posts
})
```

### where

whereは検索条件を指定することができます。

#### filter条件と演算子

| クエリ | 役割 | 参考 |
| - | - | - |
| equals | 等しい | `name: {equals: 'Eleanor'}`、なくてもいい |
| not | 等しくない | `name: {not: 'Eleanor'}` |
| in | いずれか | `name: {in: ['Alice', 'Bob']}` |
| notIn | いずれでもない | `name: {notIn: ['Alice', 'Bob']}` |
| lt | より小さい | `age: {lt: 18}` |
| lte | 以下 | `age: {lte: 18}` |
| gt | より大きい | `age: {gt: 18}` |
| gte | 以上 | `age: {gte: 18}` |
| contains | 部分一致 | `name: {contains: 'Eleanor'}` |
| search | 全文検索 | `name: {search: 'Eleanor'}` stringに対して使用可。実験機能。|
| mode | 全文検索モード | `name: {search: 'Eleanor', mode: 'insensitive'}` searchのオプション |
| startsWith | 前方一致 | `name: {startsWith: 'Eleanor'}` |
| endsWith | 後方一致 | `name: {endsWith: 'Eleanor'}` |
| AND | 複数条件 | `AND: [{content: {contains: 'Prisma'}},{published: {equals: false}},]` なくてもいい |
| OR | 複数条件 | `OR: [{content: {contains: 'Prisma'}},{published: {equals: false}},]` なくてもいい |
| NOT | 複数条件 | `NOT: [{content: {contains: 'Prisma'}},{published: {equals: false}},]` なくてもいい |

#### 関係filter

| クエリ | 役割 | 参考 |
| - | - | - |
| some | 1つ以上 | `some: {content: {contains: "Prisma"}}` defaultの指定条件。なくていい |
| every | 全て | `every: {content: {contains: "Prisma"}}` |
| none | 一致しないすべて | `post: {none: {}}` postがないすべて<br>`post: {none: {published: true}}`published: falseのpostをすべて |
| is | 一致するすべて | `is: {name: "Bob"}}` |
| isNot | 一致しないすべて | `isNot: {name: "Bob"}}` |

### orderBy

orderByはソート条件を指定することができます。

```ts
const users = await prisma.user.findMany({
  orderBy: {
    name: 'asc',
    email: 'desc',
  },
})
```

### distinct

distinctは重複を削除することができます。selectと併用して特定の組み合わせを抽出するのに使われます。

```ts
const users = await prisma.user.findMany({
  select: {
    name: true,
  },
  distinct: ['name'],
})
```

### 参照

https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#model-query-options