getBatchRecords(); // Copy defaults from where clause if the operator is = foreach ($this->where as $clause) { if (is_array($clause) && $clause[1] === '=') { $this->defaults[$clause[0]] = $clause[2]; } } $idField = $this->getSelect()[0]; $toDelete = array_diff_key(array_column($items, NULL, $idField), array_flip(array_filter(\CRM_Utils_Array::collect($idField, $this->records)))); // Try to delegate to the Save action try { $saveAction = ActionUtil::getAction($this->getEntityName(), 'save'); $saveAction ->setCheckPermissions($this->getCheckPermissions()) ->setReload($this->reload) ->setRecords($this->records) ->setDefaults($this->defaults); $result->exchangeArray((array) $saveAction->execute()); } // Fall back on Create/Update if Save doesn't exist catch (NotImplementedException $e) { foreach ($this->records as $record) { $record += $this->defaults; if (!empty($record[$idField])) { $result[] = civicrm_api4($this->getEntityName(), 'update', [ 'reload' => $this->reload, 'where' => [[$idField, '=', $record[$idField]]], 'values' => $record, 'checkPermissions' => $this->getCheckPermissions(), ])->first(); } else { $result[] = civicrm_api4($this->getEntityName(), 'create', [ 'values' => $record, 'checkPermissions' => $this->getCheckPermissions(), ])->first(); } } } if ($toDelete) { $result->deleted = (array) civicrm_api4($this->getEntityName(), 'delete', [ 'where' => [[$idField, 'IN', array_keys($toDelete)]], 'checkPermissions' => $this->getCheckPermissions(), ]); } } }