From 963b9e9e59f7917ed330390d306dfbaedc3e9f9d Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 20 Feb 2025 16:49:37 +0200 Subject: [PATCH] entity get fetched link multiple id list --- application/Espo/Core/ORM/Entity.php | 52 +++++++++++++ tests/integration/Espo/ORM/EntityTest.php | 94 +++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 tests/integration/Espo/ORM/EntityTest.php diff --git a/application/Espo/Core/ORM/Entity.php b/application/Espo/Core/ORM/Entity.php index ac66545977..958667cc7b 100644 --- a/application/Espo/Core/ORM/Entity.php +++ b/application/Espo/Core/ORM/Entity.php @@ -581,6 +581,58 @@ class Entity extends BaseEntity return $this->get($idsAttribute) ?? []; } + /** + * Get previous link-multiple field IDs. + * + * @return string[] + * @since 9.1.0 + */ + public function getFetchedLinkMultipleIdList(string $field): array + { + $idsAttribute = $field . 'Ids'; + + if (!$this->hasAttribute($idsAttribute)) { + throw new LogicException("Called `getFetchedLinkMultipleIdList` for non-link-multiple field `$field."); + } + + if (!$this->isNew()) { + if (!$this->has($idsAttribute)) { + $this->loadLinkMultipleField($field); + } else if (!$this->hasFetched($field)) { + // Set but not loaded. + + $attributes = [ + $field . 'Ids', + $field . 'Names', + $field . 'Types', + $field . 'Columns', + ]; + + $map = array_reduce($attributes, function ($p, $item) { + if (!$this->has($item)) { + return $p; + } + + $p[$item] = $this->get($item); + + return $p; + }, []); + + $this->loadLinkMultipleField($field); + + // Restore set values. + $this->setMultiple($map); + } + } + + if (!$this->has($idsAttribute) && !$this->isNew()) { + $this->loadLinkMultipleField($field); + } + + /** @var string[] */ + return $this->getFetched($idsAttribute) ?? []; + } + /** * Has an ID in a link-multiple field. */ diff --git a/tests/integration/Espo/ORM/EntityTest.php b/tests/integration/Espo/ORM/EntityTest.php new file mode 100644 index 0000000000..c3d4a7bf90 --- /dev/null +++ b/tests/integration/Espo/ORM/EntityTest.php @@ -0,0 +1,94 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace tests\integration\Espo\ORM; + +use Espo\Core\Name\Field; +use Espo\Entities\Team; +use Espo\Modules\Crm\Entities\Account; +use tests\integration\Core\BaseTestCase; + +class EntityTest extends BaseTestCase +{ + public function testLinkMultiple(): void + { + $em = $this->getEntityManager(); + + $team1 = $em->createEntity(Team::ENTITY_TYPE); + $team2 = $em->createEntity(Team::ENTITY_TYPE); + $team3 = $em->createEntity(Team::ENTITY_TYPE); + + $account = $em->createEntity(Account::ENTITY_TYPE, [ + 'teamsIds' => [ + $team1->getId(), + $team2->getId(), + ], + ]); + + $account = $em->getRDBRepositoryByClass(Account::class)->getById($account->getId()); + + $set = $account->getLinkMultipleIdList(Field::TEAMS); + $expected = [$team1->getId(), $team2->getId()]; + + $this->assertTrue( + array_diff($set, $expected) === array_diff($expected, $set) + ); + + // + + $account = $em->getRDBRepositoryByClass(Account::class)->getById($account->getId()); + + $account->addLinkMultipleId(Field::TEAMS, $team3->getId()); + + $set = $account->getFetchedLinkMultipleIdList(Field::TEAMS); + $expected = [$team1->getId(), $team2->getId()]; + + $this->assertTrue( + array_diff($set, $expected) === array_diff($expected, $set) + ); + + $set = $account->getLinkMultipleIdList(Field::TEAMS); + $expected = [$team1->getId(), $team2->getId(), $team3->getId()]; + + $this->assertTrue( + array_diff($set, $expected) === array_diff($expected, $set) + ); + + // + + $account = $em->getRDBRepositoryByClass(Account::class)->getById($account->getId()); + + $set = $account->getFetchedLinkMultipleIdList(Field::TEAMS); + $expected = [$team1->getId(), $team2->getId()]; + + $this->assertTrue( + array_diff($set, $expected) === array_diff($expected, $set) + ); + } +}