【prisma】 findMany メソッドのオプション

includeとselectは併用できない
prismaで文字列連結はできない

# サンプルDB
リレーション（1対多、多対多）のあるサンプル

prisma type attribute sample
* `@default(now())`: デフォルトで現在時刻を挿入
* `@updatedAt`: {insert | update} 時に現在時刻を挿入

```prisma:schema.prisma
// ユーザーテーブル
model Users {
  U_id                   Int       @id @default(autoincrement())
  U_name           String
  U_birth_date           DateTime? @db.Date()
  U_gender               String?   @db.Char(1)
  U_role_id              Int
  U_created_at           DateTime  @default(now())
  U_updated_at           DateTime  @updatedAt
  U_state                Int
  // リレーションを定義
  user_groups  User_groups[]
  role         Roles  @relation(fields: [role_id], references: [R_id])
}

// ユーザー・グループ中間テーブル
model User_groups {
  user_id   Int  @id
  group_id  Int  @id
  // リレーションを定義
  user   Users   @relation(fields: [user_id], references: [U_id])
  group  Groups  @relation(fields: [group_id], references: [G_id])
}

// グループテーブル
model Groups {
  G_id          Int       @id @default(autoincrement())
  G_name        String
  G_created_at  DateTime  @default(now())
  G_updated_at  DateTime  @updatedAt
  G_deleted     Boolean   @db.Bit(1)
  // リレーションを定義
  user_groups  User_groups[]
}

// 役職テーブル
model roles {
  R_id          Int       @id @default(autoincrement())
  R_name        String
  R_created_at  DateTime  @default(now())
  R_updated_at  DateTime  @updatedAt
  R_deleted     Boolean   @db.Bit(1)
  // リレーションを定義
  users  Users[]
}
```
```mermaid
erDiagram
  Users {
    int U_id PK "ID"
    string U_name "ユーザー名"
    DateTime U_birth_date "生年月日"
    string U_gender "性別"
    int U_role_id "役職ID"
    DateTime U_created_at "作成日時"
    DateTime U_updated_at "更新日時"
    int U_state "状態"
  }
  Usar_groups {
    Int user_id PK "ID"
    Int group_id PK "ID"
  }
  Groups {
    Int G_id PK "ID"
    String G_name "グループ名"
    DateTime G_created_at "作成日時"
    DateTime G_updated_at "更新日時"
    Boolean G_deleted "削除フラグ"
  }
  Roles {
    Int R_id PK "ID"
    String R_name "グループ名"
    DateTime R_created_at "作成日時"
    DateTime R_updated_at "更新日時"
    Boolean R_deleted "削除フラグ"
  }

  Users ||--o{ Usar_groups: ""
  Groups ||--o{ Usar_groups: ""
  Roles ||--o{ Users: ""
```

# SELECT 文
## WHERE, JOIN
### Prismaのクエリ
```js
prisma.users.findMany({
  where: {
    U_state: 1
  },
  select: {
    U_id: true,
    U_name: true,
    role: {
      select: {
        R_name: true
      }
    }
  }
});
```

### 生成されるMySQLのSQL
```sql
SELECT
  u.U_id,
  u.U_name,
  r.R_name AS role_name,
FROM
  Users u
LEFT JOIN
  roles d ON u.U_role_id = r.R_id
WHERE
  u.U_state = 1;
```


## 多対多で２つ先のテーブルまで参照
### Prismaのクエリ
```js
prisma.users.findUnique({
  where: {
    U_id: 1,
    U_state: 1
  },
  select: {
    U_id: true,
    U_name: true,
    role: {
      select: {
        R_name: true,
      }
    },
    user_groups: {
      select: {
        group: {
          select: {
            G_name: true,
          }
        }
      }
    }
  }
});
```

### 生成されるMySQLのSQL
```sql
SELECT
  u.U_id,
  u.U_name,
  r.R_name AS role_name,
  g.G_name AS group_name
FROM
  Users u
LEFT JOIN
  roles r ON u.U_role_id = r.R_id
LEFT JOIN
  user_groups ug ON u.U_id = ug.U_id
LEFT JOIN
  groups g ON ug.group_id = g.G_id
WHERE
  u.U_id = 1 AND u.U_state = 1;
```


# References
* [Prismaでリレーション先のデータもSELECTしたい場合のパラメータ覚書](https://wp-kyoto.net/prisma-select-relational-table-data/)
* [Prismaで、リレーション先のデータに対する`WHERE`クエリを作る](https://wp-kyoto.net/prisma-nested-where-query/)
* [Select fields (Concepts)](https://www.prisma.io/docs/concepts/components/prisma-client/select-fields)
* [Prismaのテーブル作成](https://qiita.com/k12da/items/901823b3437f94eae728)

# おわりに
他の Prisma 記事です

https://qiita.com/takekota/items/42f6a9066de60da93161

https://qiita.com/takekota/items/ad7a0b26b042d9bc725a