質問

投稿者:yaesu
登録日:2025年8月1日(金)

認証DBと更新対象DBが異なる場合、更新対象レコードを作成する方法

■やりたいこと アンケートサイト: このサイトに、アンケート回答者が、ログインしてくるので、 DB「user」で認証して、 DB「answer」にアンケート回答を保存したいと考えています ■画面遷移 次のクエスチョンの回答に沿った画面遷移を想定しています。 https://knowledge.spirers.jp/question/board/detail?topicid=206 (1)ログイン画面を開き、userで認証する  https://**********.beta.spiral-site.net/user/login (2)認証したuserに対応したanswerを表示する(レコードリストだが1行のみ)  https://**********.beta.spiral-site.net/user/list (3)レコードリストのリンクをクリックすると、回答画面を開く  https://**********.beta.spiral-site.net/user/answer ■質問 DB「answer」に1レコード追加する方法を教えてください。 以下のタイミングと条件が望ましいと考えましたが、実装方法が思いついていません。 ・回答者がログインに成功したタイミングで、 ・認証されたuserレコードに対応するanswerレコードがまだ存在しないなら、 ・answerレコードを1行追加する。 ■蛇足 ログイン成功時に、userのstatusを変更できれば、DB「user」のレコードアクションで、「他DB」に登録できるかと考えましたが。何度ログインしても1レコードのみに制限する条件の設定方法は、思いついていません。 以上、よろしくお願いします。

更新日:2025年8月25日(月)
いいね

    ベストアンサー

  • > 以下のタイミングと条件が望ましいと考えましたが、実装方法が思いついていません。 > ・回答者がログインに成功したタイミングで、 > ・認証されたuserレコードに対応するanswerレコードがまだ存在しないなら、 > ・answerレコードを1行追加する。 上記の内容で実装を行いたい場合には、3のapiの方法で実現が可能です。 ① ログインしたユーザーの情報をもとに、DB「answer」を検索 ② DB「answer」にログインしたユーザーの紐づくレコードが存在しない場合、「answer」にユーザーの情報を登録 ログインしたユーザーの情報は、getAuthRecordByFieldIDで取得することができます。 また、APIでのレコードの取得や登録に関しての詳細は下記サイトをご参照ください。 ▼PHP>getAuthRecordByFieldId($fieldId) https://support.spiral-platform.com/function/function-site-manage/6898.html#getAuthRecordByFieldIdfieldId ▼APIメソッドごとのサンプルコードまとめ Record / Record (bulk) https://knowledge.spirers.jp/article/development/detail/4148 ▼条件式や計算式の記法>参照フィールドを使った検索例 https://support.spiral-platform.com/api/16.html#%E5%8F%82%E7%85%A7%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%A4%9C%E7%B4%A2%E4%BE%8B ご確認の程、よろしくお願いいたします。

    2025年8月4日(月)

コメント

  • お問い合わせいただきましてありがとうございます。 > DB「answer」に1レコード追加する方法を教えてください。 下記の方法でレコードを追加することが可能です。 1. 「user」が登録された際に、他DBへ登録トリガを用いて「answer」へ登録 2. 登録フォームで、ユーザーが「answer」に登録 3. apiで登録 4. SPIRAL管理画面から登録 更新フォームからアンケートを回答する場合、一度登録いただく必要がございます。 アンケートを回答いただくのが1回のみの想定でしたら、登録フォームでの作成いただくことで、事前のレコード登録が不要になります。 更新フォームで作成したい、かつアンケートがユーザーにつき1件の場合でしたら1の登録トリガを用いる方法で実現可能です。

    • いいね
    2025年8月4日(月)
  • > 以下のタイミングと条件が望ましいと考えましたが、実装方法が思いついていません。 > ・回答者がログインに成功したタイミングで、 > ・認証されたuserレコードに対応するanswerレコードがまだ存在しないなら、 > ・answerレコードを1行追加する。 上記の内容で実装を行いたい場合には、3のapiの方法で実現が可能です。 ① ログインしたユーザーの情報をもとに、DB「answer」を検索 ② DB「answer」にログインしたユーザーの紐づくレコードが存在しない場合、「answer」にユーザーの情報を登録 ログインしたユーザーの情報は、getAuthRecordByFieldIDで取得することができます。 また、APIでのレコードの取得や登録に関しての詳細は下記サイトをご参照ください。 ▼PHP>getAuthRecordByFieldId($fieldId) https://support.spiral-platform.com/function/function-site-manage/6898.html#getAuthRecordByFieldIdfieldId ▼APIメソッドごとのサンプルコードまとめ Record / Record (bulk) https://knowledge.spirers.jp/article/development/detail/4148 ▼条件式や計算式の記法>参照フィールドを使った検索例 https://support.spiral-platform.com/api/16.html#%E5%8F%82%E7%85%A7%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%A4%9C%E7%B4%A2%E4%BE%8B ご確認の程、よろしくお願いいたします。

    • いいね
    2025年8月4日(月)
  • yaesu

    ご回答ありがとうございます。追加質問させてください。 >① ログインしたユーザーの情報をもとに、DB「answer」を検索 >② DB「answer」にログインしたユーザーの紐づくレコードが存在しない場合、「answer」にユーザーの情報を登録 この場合、DBの排他処理は可能ですか? 1行のuserに対して複数行のanswerが登録される可能性は、排除できますか? 本来、そのような運用は意図していませんが、事故などで、 ・一人で、ログインボタンを2回クリックした場合、 ・別人が同時に、同じアカウントでログインした場合、 など想定しました。

    • いいね
    2025年8月21日(木)
  • ご質問いただきましてありがとうございます。 >1行のuserに対して複数行のanswerが登録される可能性は、排除できますか? 該当フィールドに対してユニーク設定をすることで、DB内に同一の値が登録されることを防ぐことが可能です。 今回の場合、DB「answer」内でログインしたユーザーの情報が格納されるフィールドをユニーク設定することで、 1行のuserに対して複数行のanswerが登録されることを防ぐことができます。 ※ユニーク設定をしているフィールドに、既に存在する値と同じ値が登録されようとした場合には、DBへの登録は行われずにエラー画面が表示されます。  そのため、別途排他制御を実装いただく必要はございません。 ご確認の程、よろしくお願いいたします。

    • いいね
    2025年8月21日(木)
  • yaesu

    ご回答ありがとうございます。「ユニーク設定」理解しました。 追加質問させてください。 ■質問 認証DB「user」の値を条件にして、DB「answer」を検索するための設定。 DB「answer」のフィールド「user」(参照フィールド)について、 ラベルフィールドは、「(id)」「loginid」、どちらを使えるでしょうか? (a) 「(id)」を使える場合: 認証されているアカウント「(id)」の値を取得する方法があれば、教えてください。 getAuthRecordByFieldId()にて、(id)を指定する方法がわかりませんでした。 (b) 「login」を使える場合: 「where=@user='id001'」を試してエラーになりました。 当方のどこに不備があるか、わかれば、あるいは推察できれば、教えてください。 ※(a)(b)両方NGの場合、(参照フィールド)と内容が重複する別の項目を作る必要があるでしょうか?

    • いいね
    2025年8月25日(月)
  • yaesu

    (以下、(b)がエラーになった状況の説明です) ■DB「user」 名称 識別名 loginid テキスト(必須、ユニーク) password テキスト mail メールアドレス name テキスト ■DB「answer」 Q1 セレクト Q2 セレクト Q3 セレクト user ━ user 参照フィールド(必須、ユニーク) ■PHP $loginid=$SPIRAL->getAuthRecordByFieldId("1");//DB「user」のfield「loginid」のフィールドID=1 $commonBase = CommonBase::getInstance(); $where = "@user='".$loginid."'"; $action="/apps/". APP_ID. "/dbs/". DB_ID. "/records?where=".encode($where); $result_recordListSelect = $commonBase->apiCurlAction("GET", $action); ■実行時ログ ($where) @user='id001' ($action) /apps/2526/dbs/94768/records?where=%40user%3D%27id001%27 ($result_recordListSelect) {status=400, message=validation failed, errors=[{code=invalidParameter, message=invalid value format, locationType=query, location=/where}]} 以上、よろしくお願いします。

    • いいね
    2025年8月25日(月)
  • yaesu

    (b)について、解決しました。すみませんが、撤回させてください。 (a)については、未解決なので、方法があれば教えてください。 >(a) 「(id)」を使える場合: >認証されているアカウント「(id)」の値を取得する方法があれば、教えてください。 >(b) 「login」を使える場合: >「where=@user='id001'」を試してエラーになりました。 >当方のどこに不備があるか、わかれば、あるいは推察できれば、教えてください。 右の修正で解決しました>$where = "@user.loginid='".$pid_loginid."'"; 以上、よろしくお願いします。

    • いいね
    2025年8月25日(月)
  • (b)についてご解決いただけたの事、何よりでございます。 > (a) 「(id)」を使える場合: > 認証されているアカウント「(id)」の値を取得する方法があれば、教えてください。 > getAuthRecordByFieldId()にて、(id)を指定する方法がわかりませんでした。 認証値のidを取得する方法は、下記となります。 ▼認証idの取得方法 $SPIRAL->getAuthRecordByFieldId("_id"); ご確認の程、よろしくお願いいたします。

    • いいね
    2025年8月25日(月)
あなたもログインして、
回答してみませんか?