PluginProbe
The Innovative Form Builder – IvyForms / 1.5
The Innovative Form Builder – IvyForms v1.5
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
← All changes | backend/src/Repository/Entry/EntryRepository.php +30 -31 0.9 → 1.5 View file →
@@ -6,13 +6,8 @@
6 6 */
7 7
8 8 namespace IvyForms\Repository\Entry;
9 9
10 -// phpcs:disable PSR1.Files.SideEffects
11 -if (!defined('ABSPATH')) {
12 - exit; // Exit if accessed directly
13 -}
14 -
15 10 use IvyForms\Common\Exceptions\InvalidArgumentException;
16 11 use IvyForms\Common\Exceptions\QueryExecutionException;
17 12 use IvyForms\Common\Helpers\EntryBatchUpdater;
18 13 use IvyForms\Common\Helpers\EntryQueryHelper;
@@ -18,8 +13,9 @@
18 13 use IvyForms\Common\Helpers\EntryQueryHelper;
19 14 use IvyForms\Entity\Entry\Entry;
20 15 use IvyForms\Factory\Entry\EntryFactory;
21 16 use IvyForms\Repository\AbstractRepository;
17 +use IvyForms\Repository\VisibleFormIdsQueryFilter;
22 18 use IvyForms\Services\InstallActions\DB\Entry\EntriesTable;
23 19 use IvyForms\Services\InstallActions\DB\EntryField\EntryFieldsTable as EntryFieldsTable;
24 20 use IvyForms\Services\InstallActions\DB\Form\FormsTable;
25 21 use IvyForms\Services\Translations\BackendStrings;
@@ -44,15 +40,18 @@
44 40 public function add($entity): int
45 41 {
46 42 $data = $entity->toArray(true);
47 43
44 + $dateCreated = !empty($data['dateCreated']) ? (string)$data['dateCreated'] : current_time('mysql');
45 + $dateEdited = !empty($data['dateEdited']) ? (string)$data['dateEdited'] : $dateCreated;
46 +
48 47 $result = $this->wpdb->insert(
49 48 $this->table,
50 49 [
51 50 'formId' => $data['formId'],
52 51 'userId' => $data['userId'],
53 - 'dateCreated' => current_time('mysql'),
54 - 'dateEdited' => current_time('mysql'),
52 + 'dateCreated' => $dateCreated,
53 + 'dateEdited' => $dateEdited,
55 54 'status' => $data['status'],
56 55 'ipAddress' => $data['ipAddress'],
57 56 'userAgent' => $data['userAgent'],
58 57 'sourceURL' => $data['sourceURL'],
@@ -214,9 +213,24 @@
214 213 $countSql = "SELECT COUNT(DISTINCT e.id) FROM {$entriesTable} e $join WHERE {$whereClauses}";
215 214 $total = (int)$this->wpdb->get_var($this->wpdb->prepare($countSql, $queryParams));
216 215
217 216 // Fetch form names for all unique formIds in the results
218 - $formIdToName = $this->getFormIdToName($results, $formsTable);
217 + $formIdToName = [];
218 + $formNamesQuery = EntryQueryHelper::getFormNamesByIdsQuery($results, $formsTable);
219 + if (!empty($formNamesQuery['sql'])) {
220 + $formRows = $this->wpdb->get_results(
221 + $this->wpdb->prepare($formNamesQuery['sql'], $formNamesQuery['params']),
222 + ARRAY_A
223 + );
224 + if ($formRows === null) {
225 + throw new QueryExecutionException(
226 + BackendStrings::getExceptionStrings()['unable_get_form_names'] . __CLASS__
227 + );
228 + }
229 + foreach ($formRows as $row) {
230 + $formIdToName[$row['id']] = $row['name'];
231 + }
232 + }
219 233
220 234 return [
221 235 'data' => $results,
222 236 'meta' => [
@@ -252,8 +266,10 @@
252 266 $whereClauses = array_merge($whereClauses, $filterResult['where']);
253 267 // Ensure all values are strings
254 268 $queryParams = array_merge($queryParams, array_map('strval', $filterResult['params']));
255 269 }
270 +
271 + VisibleFormIdsQueryFilter::apply($params, $whereClauses, $queryParams, 'e.formId');
256 272 }
257 273
258 274 /**
259 275 * Get the columns that can be searched in the database (including virtual columns for search).
@@ -436,34 +452,17 @@
436 452 return $counts;
437 453 }
438 454
439 455 /**
440 - * Fetch form names for all unique formIds in the results.
441 - * @param array<int, array<string, mixed>> $results
442 - * @param string $formsTable
443 - * @return array<int, string>
456 + * Resolve owning form IDs for the given entry IDs in a single query.
457 + *
458 + * @param int[] $entryIds
459 + * @return array<int, int> entryId => formId
444 460 * @throws QueryExecutionException
445 461 */
446 - private function getFormIdToName(array $results, string $formsTable): array
462 + public function getFormIdsByEntryIds(array $entryIds): array
447 463 {
448 - $formIdToName = [];
449 - if (count($results) > 0) {
450 - $formIds = array_unique(array_column($results, 'formId'));
451 - if (count($formIds) > 0) {
452 - $placeholders = implode(',', array_fill(0, count($formIds), '%d'));
453 - $formSql = "SELECT id, name FROM {$formsTable} WHERE id IN ($placeholders)";
454 - $formRows = $this->wpdb->get_results($this->wpdb->prepare($formSql, $formIds), ARRAY_A);
455 - if ($formRows === false) {
456 - throw new QueryExecutionException(
457 - BackendStrings::getExceptionStrings()['unable_get_form_names'] . __CLASS__
458 - );
459 - }
460 - foreach ($formRows as $row) {
461 - $formIdToName[$row['id']] = $row['name'];
462 - }
463 - }
464 - }
465 - return $formIdToName;
464 + return EntryQueryHelper::fetchFormIdsByEntryIds($this->wpdb, $entryIds);
466 465 }
467 466
468 467 /**
469 468 * Get allowed columns for bulk update operations