2 namespace TYPO3\CMS\Core\Database;
223 if (!isset($this->workspaceId)) {
224 $this->workspaceId = (int)
$GLOBALS[
'BE_USER']->workspace;
260 public function start($itemlist, $tablelist, $MMtable =
'', $MMuid = 0,
$currentTable =
'', $conf = array())
262 $conf = (array)$conf;
264 $this->MM_is_foreign = (bool)$conf[
'MM_opposite_field'];
265 $this->MM_oppositeField = $conf[
'MM_opposite_field'];
266 $this->MM_table_where = $conf[
'MM_table_where'];
267 $this->MM_hasUidField = $conf[
'MM_hasUidField'];
268 $this->MM_match_fields = is_array($conf[
'MM_match_fields']) ? $conf[
'MM_match_fields'] : array();
269 $this->MM_insert_fields = is_array($conf[
'MM_insert_fields']) ? $conf[
'MM_insert_fields'] :
$this->MM_match_fields;
271 if (!empty($conf[
'MM_oppositeUsage']) && is_array($conf[
'MM_oppositeUsage'])) {
272 $this->MM_oppositeUsage = $conf[
'MM_oppositeUsage'];
274 if ($this->MM_is_foreign) {
275 $tmp = $conf[
'type'] ===
'group' ? $conf[
'allowed'] : $conf[
'foreign_table'];
280 $this->MM_oppositeTable = $tmp[0];
285 if ($this->MM_oppositeFieldConf[
'allowed']) {
286 $oppositeFieldConf_allowed = explode(
',', $this->MM_oppositeFieldConf[
'allowed']);
287 if (count($oppositeFieldConf_allowed) > 1 || $this->MM_oppositeFieldConf[
'allowed'] ===
'*') {
288 $this->MM_isMultiTableRelationship = $oppositeFieldConf_allowed[0];
294 if (trim($tablelist) ===
'*') {
295 $tablelist = implode(
',', array_keys(
$GLOBALS[
'TCA']));
299 foreach ($tempTableArray as $val) {
301 $this->tableArray[$tName] = array();
302 if ($this->checkIfDeleted &&
$GLOBALS[
'TCA'][$tName][
'ctrl'][
'delete']) {
303 $fieldN = $tName .
'.' .
$GLOBALS[
'TCA'][$tName][
'ctrl'][
'delete'];
304 $this->additionalWhere[$tName] .=
' AND ' . $fieldN .
'=0';
307 if (is_array($this->tableArray)) {
308 reset($this->tableArray);
315 $this->firstTable = key($this->tableArray);
316 next($this->tableArray);
319 $this->secondTable = key($this->tableArray);
324 $this->
readMM($MMtable, $MMuid);
331 }
elseif ($MMuid && $conf[
'foreign_field']) {
338 if ($conf[
'foreign_default_sortby']) {
339 $this->
sortList($conf[
'foreign_default_sortby']);
351 $this->fetchAllFields = (bool)$allFields;
388 public function readList($itemlist, array $configuration)
390 if ((
string)trim($itemlist) !=
'') {
394 foreach ($tempItemArray as $key => $val) {
400 $parts = explode(
'_', $val, 2);
401 $theID = strrev($parts[0]);
406 $theTable = trim($parts[1])
407 ? strrev(trim($parts[1]))
410 if (((
string)$theID !=
'' && $theID) && $theTable && isset($this->tableArray[$theTable])) {
412 $theID = $this->secondTable ? abs((
int)$theID) : (int)$theID;
414 $this->itemArray[$key][
'id'] = $theID;
415 $this->itemArray[$key][
'table'] = $theTable;
416 $this->tableArray[$theTable][] = $theID;
423 if (!$isSet && $this->registerNonTableValues) {
424 $this->itemArray[$key][
'id'] = $tempItemArray[$key];
425 $this->itemArray[$key][
'table'] =
'_NO_TABLE';
426 $this->nonTableArray[] = $tempItemArray[$key];
431 if ($configuration[
'type'] !==
'inline' || empty($configuration[
'foreign_table']) || !empty($configuration[
'foreign_field'])
432 || !empty($configuration[
'MM']) || count($this->tableArray) !== 1 || empty($this->tableArray[$configuration[
'foreign_table']])
438 if ($this->useLiveReferenceIds) {
439 foreach ($this->itemArray as &$item) {
444 $this->itemArray = array();
445 $foreignTable = $configuration[
'foreign_table'];
446 $ids = $this->getResolver($foreignTable, $this->tableArray[$foreignTable])->get();
447 foreach ($ids as $id) {
448 $this->itemArray[] = array(
450 'table' => $foreignTable,
468 if ($sortby ==
'uid') {
472 return $a[
'id'] < $b[
'id'] ? -1 : 1;
475 }
elseif (count($this->tableArray) === 1) {
476 reset($this->tableArray);
477 $table = key($this->tableArray);
478 $uidList = implode(
',', current($this->tableArray));
480 $this->itemArray = array();
481 $this->tableArray = array();
482 $res =
$GLOBALS[
'TYPO3_DB']->exec_SELECTquery(
'uid', $table,
'uid IN (' . $uidList .
')',
'', $sortby);
483 while ($row =
$GLOBALS[
'TYPO3_DB']->sql_fetch_assoc($res)) {
484 $this->itemArray[] = array(
'id' => $row[
'uid'],
'table' => $table);
485 $this->tableArray[$table][] = $row[
'uid'];
487 $GLOBALS[
'TYPO3_DB']->sql_free_result($res);
506 if ($this->MM_is_foreign) {
507 $uidLocal_field =
'uid_foreign';
508 $uidForeign_field =
'uid_local';
509 $sorting_field =
'sorting_foreign';
510 if ($this->MM_isMultiTableRelationship) {
514 if ($this->currentTable == $this->MM_isMultiTableRelationship) {
522 $uidLocal_field =
'uid_local';
523 $uidForeign_field =
'uid_foreign';
524 $sorting_field =
'sorting';
526 if ($this->MM_table_where) {
527 $additionalWhere .= LF . str_replace(
'###THIS_UID###', (
int)$uid, $this->MM_table_where);
529 foreach ($this->MM_match_fields as $field => $value) {
534 $res =
$GLOBALS[
'TYPO3_DB']->exec_SELECTquery(
'*', $tableName, $where,
'', $sorting_field);
535 while ($row =
$GLOBALS[
'TYPO3_DB']->sql_fetch_assoc($res)) {
537 if (!$this->MM_is_foreign) {
541 if (($row[$uidForeign_field] || $theTable ==
'pages') && $theTable && isset($this->tableArray[$theTable])) {
542 $this->itemArray[$key][
'id'] = $row[$uidForeign_field];
543 $this->itemArray[$key][
'table'] = $theTable;
544 $this->tableArray[$theTable][] = $row[$uidForeign_field];
545 }
elseif ($this->registerNonTableValues) {
546 $this->itemArray[$key][
'id'] = $row[$uidForeign_field];
547 $this->itemArray[$key][
'table'] =
'_NO_TABLE';
548 $this->nonTableArray[] = $row[$uidForeign_field];
552 $GLOBALS[
'TYPO3_DB']->sql_free_result($res);
563 public function writeMM($MM_tableName, $uid, $prependTableName =
false)
566 if ($this->MM_is_foreign) {
567 $uidLocal_field =
'uid_foreign';
568 $uidForeign_field =
'uid_local';
569 $sorting_field =
'sorting_foreign';
572 $uidLocal_field =
'uid_local';
573 $uidForeign_field =
'uid_foreign';
574 $sorting_field =
'sorting';
577 $tableC = count($this->tableArray);
580 $prep = $tableC > 1 || $prependTableName || $this->MM_isMultiTableRelationship ? 1 : 0;
582 $additionalWhere_tablenames =
'';
583 if ($this->MM_is_foreign && $prep) {
584 $additionalWhere_tablenames =
' AND tablenames=' .
$GLOBALS[
'TYPO3_DB']->fullQuoteStr($this->currentTable, $MM_tableName);
588 if ($this->MM_table_where) {
589 $additionalWhere .= LF . str_replace(
'###THIS_UID###', (
int)$uid, $this->MM_table_where);
592 foreach ($this->MM_match_fields as $field => $value) {
595 $res =
$GLOBALS[
'TYPO3_DB']->exec_SELECTquery(
596 $uidForeign_field . ($prep ?
', tablenames' :
'') . ($this->MM_hasUidField ?
', uid' :
''),
598 $uidLocal_field .
'=' . $uid . $additionalWhere_tablenames .
$additionalWhere,
607 $oldMMs_inclUid = array();
608 while ($row =
$GLOBALS[
'TYPO3_DB']->sql_fetch_assoc($res)) {
609 if (!$this->MM_is_foreign && $prep) {
610 $oldMMs[] = array($row[
'tablenames'], $row[$uidForeign_field]);
612 $oldMMs[] = $row[$uidForeign_field];
614 $oldMMs_inclUid[] = array($row[
'tablenames'], $row[$uidForeign_field], $row[
'uid']);
616 $GLOBALS[
'TYPO3_DB']->sql_free_result($res);
618 foreach ($this->itemArray as $val) {
620 if ($prep || $val[
'table'] ==
'_NO_TABLE') {
622 if ($this->MM_is_foreign) {
625 $tablename = $val[
'table'];
630 if (!$this->MM_is_foreign && $prep) {
631 $item = array($val[
'table'], $val[
'id']);
635 if (in_array($item, $oldMMs)) {
636 $oldMMs_index = array_search($item, $oldMMs);
640 $whereClause = $uidLocal_field .
'=' . $uid .
' AND ' . $uidForeign_field .
'=' . $val[
'id']
641 . ($this->MM_hasUidField ?
' AND uid=' . (int)$oldMMs_inclUid[$oldMMs_index][2] :
'');
643 $whereClause .=
' AND tablenames=' .
$GLOBALS[
'TYPO3_DB']->fullQuoteStr($tablename, $MM_tableName);
645 $GLOBALS[
'TYPO3_DB']->exec_UPDATEquery($MM_tableName, $whereClause . $additionalWhere, array($sorting_field => $c));
648 unset($oldMMs[$oldMMs_index]);
651 unset($oldMMs_inclUid[$oldMMs_index]);
654 $insertFields[$uidLocal_field] = $uid;
655 $insertFields[$uidForeign_field] = $val[
'id'];
656 $insertFields[$sorting_field] = $c;
658 $insertFields[
'tablenames'] = $tablename;
661 $GLOBALS[
'TYPO3_DB']->exec_INSERTquery($MM_tableName, $insertFields);
662 if ($this->MM_is_foreign) {
663 $this->updateRefIndex($val[
'table'], $val[
'id']);
668 if (is_array($oldMMs) && !empty($oldMMs)) {
669 $removeClauses = array();
670 $updateRefIndex_records = array();
671 foreach ($oldMMs as $oldMM_key => $mmItem) {
673 if ($this->MM_hasUidField) {
674 $removeClauses[] =
'uid=' . (int)$oldMMs_inclUid[$oldMM_key][2];
676 if (is_array($mmItem)) {
677 $removeClauses[] =
'tablenames=' .
$GLOBALS[
'TYPO3_DB']->fullQuoteStr($mmItem[0], $MM_tableName)
678 .
' AND ' . $uidForeign_field .
'=' . $mmItem[1];
680 $removeClauses[] = $uidForeign_field .
'=' . $mmItem;
683 if ($this->MM_is_foreign) {
684 if (is_array($mmItem)) {
685 $updateRefIndex_records[] = array($mmItem[0], $mmItem[1]);
687 $updateRefIndex_records[] = array($this->firstTable, $mmItem);
691 $deleteAddWhere =
' AND (' . implode(
' OR ', $removeClauses) .
')';
692 $where = $uidLocal_field .
'=' . (int)$uid . $deleteAddWhere . $additionalWhere_tablenames . $additionalWhere;
693 $GLOBALS[
'TYPO3_DB']->exec_DELETEquery($MM_tableName, $where);
695 foreach ($updateRefIndex_records as $pair) {
696 $this->updateRefIndex($pair[0], $pair[1]);
702 $this->updateRefIndex($this->currentTable, $uid);
716 public function remapMM($MM_tableName, $uid, $newUid, $prependTableName =
false)
719 if ($this->MM_is_foreign) {
720 $uidLocal_field =
'uid_foreign';
723 $uidLocal_field =
'uid_local';
726 $tableC = count($this->tableArray);
730 $additionalWhere_tablenames =
'';
731 if ($this->MM_is_foreign && $prep) {
732 $additionalWhere_tablenames =
' AND tablenames=' .
$GLOBALS[
'TYPO3_DB']->fullQuoteStr($this->currentTable, $MM_tableName);
736 if ($this->MM_table_where) {
737 $additionalWhere .= LF . str_replace(
'###THIS_UID###', (
int)$uid, $this->MM_table_where);
740 foreach ($this->MM_match_fields as $field => $value) {
743 $where = $uidLocal_field .
'=' . (int)$uid . $additionalWhere_tablenames .
$additionalWhere;
744 $GLOBALS[
'TYPO3_DB']->exec_UPDATEquery($MM_tableName, $where, array($uidLocal_field => $newUid));
758 if ($this->useLiveParentIds) {
764 $foreign_table = $conf[
'foreign_table'];
765 $foreign_table_field = $conf[
'foreign_table_field'];
767 $foreign_match_fields = is_array($conf[
'foreign_match_fields']) ? $conf[
'foreign_match_fields'] : array();
769 if ($conf[
'symmetric_field']) {
770 $whereClause =
'(' . $conf[
'foreign_field'] .
'=' . $uid .
' OR ' . $conf[
'symmetric_field'] .
'=' . $uid .
')';
772 $whereClause = $conf[
'foreign_field'] .
'=' . $uid;
775 if ($useDeleteClause) {
780 if ($foreign_table_field && $this->currentTable) {
781 $whereClause .=
' AND ' . $foreign_table_field .
'=' .
$GLOBALS[
'TYPO3_DB']->fullQuoteStr($this->currentTable, $foreign_table);
784 foreach ($foreign_match_fields as $field => $value) {
785 $whereClause .=
' AND ' . $field .
'=' .
$GLOBALS[
'TYPO3_DB']->fullQuoteStr($value, $foreign_table);
790 $whereClause .=
' AND ' . $foreign_table .
'.t3ver_wsid IN (' . $workspaceList .
') AND ' . $foreign_table .
'.pid<>-1';
795 if ($conf[
'foreign_sortby']) {
796 if ($conf[
'symmetric_sortby'] && $conf[
'symmetric_field']) {
800 WHEN ' . $conf[
'foreign_field'] .
'=' . $uid .
'
801 THEN ' . $conf[
'foreign_sortby'] .
'
802 ELSE ' . $conf[
'symmetric_sortby'] .
'
806 $sortby = $conf[
'foreign_sortby'];
808 }
elseif ($conf[
'foreign_default_sortby']) {
810 $sortby = $conf[
'foreign_default_sortby'];
813 $sortby =
$GLOBALS[
'TCA'][$foreign_table][
'ctrl'][
'sortby'];
814 }
elseif (
$GLOBALS[
'TCA'][$foreign_table][
'ctrl'][
'default_sortby']) {
816 $sortby =
$GLOBALS[
'TCA'][$foreign_table][
'ctrl'][
'default_sortby'];
819 $sortby =
$GLOBALS[
'TYPO3_DB']->stripOrderBy($sortby);
821 $rows =
$GLOBALS[
'TYPO3_DB']->exec_SELECTgetRows(
'uid', $foreign_table, $whereClause,
'', $sortby,
'',
'uid');
823 $ids = $this->getResolver($foreign_table, array_keys($rows), $sortby)->get();
824 foreach ($ids as $id) {
825 $this->itemArray[$key][
'id'] = $id;
826 $this->itemArray[$key][
'table'] = $foreign_table;
827 $this->tableArray[$foreign_table][] = $id;
844 if ($this->useLiveParentIds) {
846 if (!empty($updateToUid)) {
852 $foreign_table = $conf[
'foreign_table'];
853 $foreign_field = $conf[
'foreign_field'];
854 $symmetric_field = $conf[
'symmetric_field'];
855 $foreign_table_field = $conf[
'foreign_table_field'];
856 $foreign_match_fields = is_array($conf[
'foreign_match_fields']) ? $conf[
'foreign_match_fields'] : array();
864 $fields =
'uid,pid,' . $foreign_field;
866 if ($symmetric_field) {
867 $fields .=
',' . $symmetric_field;
870 if ($considerWorkspaces) {
871 $fields .=
',t3ver_wsid,t3ver_state,t3ver_oid';
874 foreach ($this->itemArray as $val) {
876 $table = $val[
'table'];
879 if ($symmetric_field || $considerWorkspaces) {
885 $isOnSymmetricSide =
false;
886 if ($symmetric_field) {
887 $isOnSymmetricSide = self::isOnSymmetricSide($parentUid, $conf, $row);
889 $updateValues = $foreign_match_fields;
894 if ($isOnSymmetricSide) {
895 $updateValues[$symmetric_field] = $parentUid;
897 $updateValues[$foreign_field] = $parentUid;
900 if ($foreign_table_field && $this->currentTable) {
908 if ($conf[
'foreign_sortby']) {
909 $sortby = $conf[
'foreign_sortby'];
912 $sortby =
$GLOBALS[
'TCA'][$foreign_table][
'ctrl'][
'sortby'];
916 if ($isOnSymmetricSide && isset($conf[
'symmetric_sortby']) && $conf[
'symmetric_sortby']) {
917 $sortby = $conf[
'symmetric_sortby'];
919 $sortby =
$GLOBALS[
'TYPO3_DB']->stripOrderBy($sortby);
922 $updateValues[$sortby] = ++$c;
926 if ($isOnSymmetricSide) {
927 $updateValues[$symmetric_field] = $updateToUid;
929 $updateValues[$foreign_field] = $updateToUid;
933 if (!empty($updateValues)) {
934 $GLOBALS[
'TYPO3_DB']->exec_UPDATEquery($table,
'uid=' . (
int)$uid, $updateValues);
935 $this->updateRefIndex($table, $uid);
938 if ($considerWorkspaces) {
941 $GLOBALS[
'TYPO3_DB']->exec_UPDATEquery($table,
'uid=' . (
int)$row[
't3ver_oid'], $updateValues);
957 $valueArray = array();
958 $tableC = count($this->tableArray);
962 $prep = $tableC > 1 || $prependTableName;
964 foreach ($this->itemArray as $val) {
965 $valueArray[] = ($prep && $val[
'table'] !=
'_NO_TABLE' ? $val[
'table'] .
'_' :
'') . $val[
'id'];
984 if (is_array($valueArray) && $fTable) {
985 foreach ($valueArray as $key => $val) {
987 $parts = explode(
'_', $val, 2);
988 $theID = strrev($parts[0]);
989 $theTable = strrev($parts[1]);
991 && (!$theTable || $theTable === (
string)$fTable || $theTable === (
string)$nfTable)
993 $valueArray[$key] = $theTable && $theTable !== (string)$fTable ? $theID * -1 : $theID;
1011 foreach ($this->tableArray as $key => $val) {
1012 if (is_array($val)) {
1013 $itemList = implode(
',', $val);
1015 if ($this->fetchAllFields) {
1019 if (
$GLOBALS[
'TCA'][$key][
'ctrl'][
'label']) {
1021 $from .=
',' .
$GLOBALS[
'TCA'][$key][
'ctrl'][
'label'];
1023 if (
$GLOBALS[
'TCA'][$key][
'ctrl'][
'label_alt']) {
1025 $from .=
',' .
$GLOBALS[
'TCA'][$key][
'ctrl'][
'label_alt'];
1027 if (
$GLOBALS[
'TCA'][$key][
'ctrl'][
'thumbnail']) {
1029 $from .=
',' .
$GLOBALS[
'TCA'][$key][
'ctrl'][
'thumbnail'];
1032 $res =
$GLOBALS[
'TYPO3_DB']->exec_SELECTquery($from, $key,
'uid IN (' . $itemList .
')' . $this->additionalWhere[$key]);
1033 while ($row =
$GLOBALS[
'TYPO3_DB']->sql_fetch_assoc($res)) {
1034 $this->results[$key][$row[
'uid']] = $row;
1036 $GLOBALS[
'TYPO3_DB']->sql_free_result($res);
1050 if (!is_array($this->itemArray)) {
1054 $titleLen = (int)
$GLOBALS[
'BE_USER']->uc[
'titleLen'];
1055 foreach ($this->itemArray as $val) {
1056 $theRow = $this->results[$val[
'table']][$val[
'id']];
1057 if ($theRow && is_array(
$GLOBALS[
'TCA'][$val[
'table']])) {
1060 $label = $label ? $label :
'[...]';
1061 $output[] = str_replace(
',',
'', $val[
'table'] .
'_' . $val[
'id'] .
'|' . rawurlencode($label));
1064 return implode(
',', $output);
1075 $count = count($this->itemArray);
1076 if ($returnAsArray) {
1077 $count = array($count);
1091 public function updateRefIndex($table, $id)
1093 $statisticsArray = array();
1094 if ($this->updateReferenceIndex) {
1100 $statisticsArray = $refIndexObj->updateRefIndexTable($table, $id);
1102 return $statisticsArray;
1119 $purgeCallback =
'purgeVersionedIds';
1122 $purgeCallback =
'purgeLiveVersionedIds';
1126 $this->purged = ($this->purged || $itemArrayHasBeenPurged);
1127 return $itemArrayHasBeenPurged;
1137 if (!$this->useLiveReferenceIds || $this->
getWorkspaceId() === 0) {
1152 $itemArrayHasBeenPurged =
false;
1154 foreach ($this->tableArray as $itemTableName => $itemIds) {
1159 $purgedItemIds = call_user_func(array($this, $purgeCallback), $itemTableName, $itemIds);
1160 $removedItemIds = array_diff($itemIds, $purgedItemIds);
1161 foreach ($removedItemIds as $removedItemId) {
1164 $this->tableArray[$itemTableName] = $purgedItemIds;
1165 if (!empty($removedItemIds)) {
1166 $itemArrayHasBeenPurged =
true;
1170 return $itemArrayHasBeenPurged;
1183 $ids = array_combine($ids, $ids);
1186 'uid,t3ver_oid,t3ver_state',
1188 'pid=-1 AND t3ver_oid IN (' . implode(
',', $ids) .
') AND t3ver_wsid<>0',
1193 if (!empty($versions)) {
1194 foreach ($versions as $version) {
1195 $versionId = $version[
'uid'];
1196 if (isset($ids[$versionId])) {
1197 unset($ids[$versionId]);
1202 return array_values($ids);
1215 $ids = array_combine($ids, $ids);
1218 'uid,t3ver_oid,t3ver_state',
1220 'pid=-1 AND t3ver_oid IN (' . implode(
',', $ids) .
') AND t3ver_wsid<>0',
1225 if (!empty($versions)) {
1226 foreach ($versions as $version) {
1227 $versionId = $version[
'uid'];
1228 $liveId = $version[
't3ver_oid'];
1229 if (isset($ids[$liveId]) && isset($ids[$versionId])) {
1230 unset($ids[$liveId]);
1235 return array_values($ids);
1248 $ids = array_combine($ids, $ids);
1251 'uid,t3ver_oid,t3ver_state',
1253 'pid=-1 AND t3ver_oid IN (' . implode(
',', $ids) .
') AND t3ver_wsid=' . $this->
getWorkspaceId() .
1257 if (!empty($versions)) {
1258 foreach ($versions as $version) {
1259 $liveId = $version[
't3ver_oid'];
1260 if (isset($ids[$liveId])) {
1261 unset($ids[$liveId]);
1266 return array_values($ids);
1271 foreach ($this->itemArray as $index => $item) {
1272 if ($item[
'table'] === $tableName && (
string)$item[
'id'] === (
string)$id) {
1273 unset($this->itemArray[$index]);
1291 && $parentConf[
'symmetric_field']
1292 && $parentUid == $childRec[$parentConf[
'symmetric_field']];
1305 if (empty($this->MM_oppositeUsage[$tableName]) || count($this->MM_oppositeUsage[$tableName]) > 1) {
1306 return $referenceValues;
1309 $fieldName = $this->MM_oppositeUsage[$tableName][0];
1310 if (empty(
$GLOBALS[
'TCA'][$tableName][
'columns'][$fieldName][
'config'])) {
1311 return $referenceValues;
1314 $configuration =
$GLOBALS[
'TCA'][$tableName][
'columns'][$fieldName][
'config'];
1315 if (!empty($configuration[
'MM_insert_fields'])) {
1316 $referenceValues = array_merge($configuration[
'MM_insert_fields'], $referenceValues);
1317 }
elseif (!empty($configuration[
'MM_match_fields'])) {
1318 $referenceValues = array_merge($configuration[
'MM_match_fields'], $referenceValues);
1321 return $referenceValues;
1335 if ($liveDefaultId === null) {
1336 $liveDefaultId = $id;
1338 return (
int)$liveDefaultId;
1347 protected function getResolver($tableName, array $ids, $sortingStatement = null)
1351 PlainDataResolver::class,
1357 $resolver->setKeepDeletePlaceholder(
true);
1358 $resolver->setKeepLiveIds($this->useLiveReferenceIds);