質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

1回答

1279閲覧

prismaでの値の取得方法

fje

総合スコア1

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2022/12/26 01:31

前提

Next.js/TypeScript/GraphQL/Postgresを使って、店舗の1日の情報を記録する日報を作成しております。
Prismaを使って保存した値(total)を取得するようにしたいのですが処理がうまくいきません。
prisma.tsというファイルでの記載方法のアドバイスをいただきたいです。

実現したいこと

  • dailyReportテーブルのtotalというカラムから値を取得したい

事前情報

modelの情報

  • Company = 企業
  • Shop = 店舗
  • DailyReport = 日報

取得したい値
total = 人件費

該当のソースコード

schema.ts

1model Company { 2 id Int @id @default(autoincrement()) 3 name String @db.VarChar(255) 4 slug String @unique @db.VarChar(255) 5 createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) 6 updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0) 7 email String? @unique @db.VarChar(255) 8 shops Shop[] 9} 10 11model Shop { 12 id Int @id @default(autoincrement()) 13 name String @db.VarChar(255) 14 companyId Int @map("company_id") 15 shopId Int? @map("shop_id") 16 DailyReport DailyReport[] 17 @@unique([companyId, shopId], name: "shops_company_id_shop_id_unique") 18 @@map("shops") 19} 20 21model DailyReport { 22 id Int @id @default(autoincrement()) 23 shopId Int @map("shop_id") 24 date String? 25 total Int? @map("rent_cost") 26 createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) 27 updatedAt DateTime? @default(now()) @map("updated_at") @db.Timestamp(0) 28 29 shop Shop @relation(fields: [shopId], references: [id]) 30 @@index([shopId], name: "monthly_reports_shop_id_index") 31 @@map("monthly_reports") 32} 33

prisma.ts

1async getDailyReports(companySlug: string, shopId: number, date: string): Promise<number> { 2 return ( 3 this.prisma.shop 4 .findFirst({ 5 where: { 6 shopId, 7 company: { 8 slug: companySlug, 9 }, 10 }, 11 }) 12 .then(shop => { 13 if (!shop) throw 'Shop not found'; 14 return ( 15 this.prisma.dailyReport 16 .findFirst({ 17 where: { 18 shopId: shop.id, 19 date: date, 20 }, 21 }) 22 .then(dailyReports => { 23 return dailyReports.map(dailyReport => { 24 const { total } = dailyReport; 25 return { 26 total, 27 }; 28 }); 29 }) 30 ); 31 }) 32 ); 33 }

試したこと

  1. prisma.tsのgetDailyReportsの引数で受け取った、companySlugと shopIdから取得したい店舗の情報を取得
  2. dailyReportから該当するshopIdとdateのレコードを取得
  3. 取得したレコードからtotalを返す

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uky

2022/12/31 08:06

こちらthenで繋ぐのではなく、一つずつawaitで実行することで解消されたりしませんか?? この記法であればやりたいことは同じになりそうです。
guest

回答1

0

prisma.ts

1~~ 省略 ~~ 2 return ( 3 this.prisma.dailyReport 4 .findFirst({ 5 where: { 6 shopId: shop.id, 7 date: date, 8 }, 9 }) 10 .then(dailyReports => { 11 return dailyReports.map(dailyReport => { 12 const { total } = dailyReport; 13 return { 14 total, 15 }; 16 }); 17 }) 18~~ 省略 ~~

prismaのfindFirstが返却するのは配列ではないので、dailyReports.mapが呼べなくなっているのではないでしょうか。

参考のReturnTypeを確認するとObjectかnullかエラーが返るとあります。

参考:https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findfirst

投稿2022/12/31 08:14

編集2022/12/31 08:16
uky

総合スコア207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問