@@ -172,6 +172,51 @@ public function massUpdate(string $method, array $data): array
172172 return ['records ' => $ records ];
173173 }
174174
175+ public function upsert ($ data = null , $ fieldsToMergeOn = [])
176+ {
177+ $ records = [];
178+ $ updatedRecords = [];
179+ $ createdRecords = [];
180+
181+ $ chunks = array_chunk ($ data , 10 );
182+ foreach ($ chunks as $ key => $ dataChunk ) {
183+ $ contents = [];
184+ foreach ($ dataChunk as $ dataRow ) {
185+ $ contents [] = (object ) [
186+ 'fields ' => (object ) $ dataRow ,
187+ ];
188+ }
189+
190+ $ params = ['performUpsert ' => (object ) ['fieldsToMergeOn ' => $ fieldsToMergeOn ], 'records ' => $ contents ];
191+
192+ $ responseData = $ this ->decodeResponse (
193+ $ this ->client ->patch ($ this ->getEndpointUrl (), $ params )
194+ );
195+
196+ if ($ responseData ->has ('records ' )) {
197+ $ records += $ responseData ->get ('records ' );
198+ }
199+
200+ if ($ responseData ->has ('updatedRecords ' )) {
201+ $ updatedRecords += $ responseData ->get ('updatedRecords ' );
202+ }
203+
204+ if ($ responseData ->has ('createdRecords ' )) {
205+ $ createdRecords += $ responseData ->get ('createdRecords ' );
206+ }
207+
208+ if (isset ($ chunks [$ key + 1 ])) {
209+ usleep ($ this ->delay );
210+ }
211+ }
212+
213+ return collect ([
214+ 'records ' => $ records ,
215+ 'updatedRecords ' => $ updatedRecords ,
216+ 'createdRecords ' => $ createdRecords ,
217+ ]);
218+ }
219+
175220 public function delete (string $ id )
176221 {
177222 $ url = $ this ->getEndpointUrl ($ id );
0 commit comments