includeとselectは併用できない
prismaで文字列連結はできない
サンプルDB
リレーション(1対多、多対多)のあるサンプル
prisma type attribute sample
-
@default(now())
: デフォルトで現在時刻を挿入 -
@updatedAt
: {insert | update} 時に現在時刻を挿入
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[]
}
SELECT 文
WHERE, JOIN
Prismaのクエリ
prisma.users.findMany({
where: {
U_state: 1
},
select: {
U_id: true,
U_name: true,
role: {
select: {
R_name: true
}
}
}
});
生成されるMySQLの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;
多対多で2つ先のテーブルまで参照
Prismaのクエリ
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
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したい場合のパラメータ覚書
- Prismaで、リレーション先のデータに対する
WHERE
クエリを作る - Select fields (Concepts)
- Prismaのテーブル作成
おわりに
他の Prisma 記事です