回答編集履歴

3

クエリに関してはfirestoreのトランザクションは使えないようでした。コード修正しました。

2021/02/11 08:06

投稿

Arahabica
Arahabica

スコア209

test CHANGED
@@ -18,62 +18,50 @@
18
18
 
19
19
  ```:js
20
20
 
21
- async updateUserBalance({ state, commit }, getTransfer) {
21
+ async updateUserBalance({ state, commit }, getTransfer) {
22
22
 
23
- const isMyUid = firebase.auth().currentUser.uid
23
+ const isMyUid = firebase.auth().currentUser.uid
24
24
 
25
- //送金される側
25
+ try {
26
26
 
27
- try {
27
+ const receiverDocs = await db.collection('users').where('uid', '==', state.isUid).get()
28
28
 
29
- await db.runTransaction(async t => {
29
+ const receiverId = receiverDocs[0].id
30
30
 
31
- const userDocs = await t.get(
31
+ const senderDocs = await db.collection('users').where('uid', '==', isMyUid).get()
32
32
 
33
- db.collection('users').where('uid', '==', state.isUid)
33
+ const senderId = senderDocs[0].id
34
34
 
35
- )
35
+ await db.runTransaction(async t => {
36
36
 
37
- for (const doc of userDocs) {
37
+ //送金される側
38
38
 
39
- await t.update(db.collection('users').doc(doc.id), {
39
+ await t.update(db.collection('users').doc(receiverId), {
40
40
 
41
- balance: firebase.firestore.FieldValue.increment(Number(getTransfer))
41
+ balance: firebase.firestore.FieldValue.increment(Number(getTransfer))
42
-
43
- })
44
-
45
- }
46
-
47
- commit('updateDestinationBalance', getTransfer)
48
-
49
- //送金する側
50
-
51
- const myUserDocs = await t.get(
52
-
53
- db.collection('users').where('uid', '==', isMyUid)
54
-
55
- )
56
-
57
- for (const doc of myUserDocs) {
58
-
59
- await t.update(db.collection('users').doc(doc.id), {
60
-
61
- balance: firebase.firestore.FieldValue.increment(-Number(getTransfer))
62
-
63
- })
64
-
65
- }
66
-
67
- commit('updateMyBalance', getTransfer)
68
42
 
69
43
  })
70
44
 
71
- } catch (error) {
45
+ commit('updateDestinationBalance', getTransfer)
72
46
 
73
- console.log(error)
47
+ //送金する側
74
48
 
49
+ await t.update(db.collection('users').doc(senderId), {
50
+
51
+ balance: firebase.firestore.FieldValue.increment(-Number(getTransfer))
52
+
75
- }
53
+ })
54
+
55
+ commit('updateMyBalance', getTransfer)
56
+
57
+ })
58
+
59
+ } catch (error) {
60
+
61
+ console.log(error)
76
62
 
77
63
  }
78
64
 
65
+ }
66
+
79
67
  ```

2

firebase.firestore.FieldValue.increment の説明を追加

2021/02/11 08:06

投稿

Arahabica
Arahabica

スコア209

test CHANGED
@@ -7,6 +7,12 @@
7
7
 
8
8
 
9
9
  サーバサイドでも似たようなコードで動作するはずです。
10
+
11
+
12
+
13
+ ちなみに、`firebase.firestore.FieldValue.increment` は現在の値に対してインクリメントできる機能です。
14
+
15
+ 参考) https://qiita.com/1amageek/items/665df5a6d9921319e300
10
16
 
11
17
 
12
18
 

1

FieldValue.increment を使うように修正しました。

2021/02/11 07:04

投稿

Arahabica
Arahabica

スコア209

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  await t.update(db.collection('users').doc(doc.id), {
34
34
 
35
- balance: Number(state.isBalance) + Number(getTransfer)
35
+ balance: firebase.firestore.FieldValue.increment(Number(getTransfer))
36
36
 
37
37
  })
38
38
 
@@ -52,7 +52,7 @@
52
52
 
53
53
  await t.update(db.collection('users').doc(doc.id), {
54
54
 
55
- balance: Number(state.balance) - Number(getTransfer)
55
+ balance: firebase.firestore.FieldValue.increment(-Number(getTransfer))
56
56
 
57
57
  })
58
58