Skip to content

Commit 28681aa

Browse files
Add support for upsert airtable api method (#69)
* Add support for `upsert` airtable api method * Remove redundant empty line from `\App\Airtable\AirtableApiClient`
1 parent e6da278 commit 28681aa

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/Airtable.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ public function select(array $fields = [])
182182
return $this;
183183
}
184184

185+
public function upsert(array $data, array $fieldsToMergeOn)
186+
{
187+
return $this->api->upsert($data, $fieldsToMergeOn);
188+
}
189+
185190
private function toCollection($object)
186191
{
187192
return isset($object['records']) ? collect($object['records']) : $object;

src/Api/AirtableApiClient.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)