mirror of
https://github.com/espocrm/espocrm.git
synced 2026-06-28 15:06:06 +00:00
orm set relations dev, tests
This commit is contained in:
@@ -36,6 +36,7 @@ use Espo\Core\ORM\Entity;
|
||||
use Espo\Core\ORM\Helper;
|
||||
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\ORM\Relation\Relations;
|
||||
use Espo\ORM\Value\ValueAccessorFactory;
|
||||
|
||||
class Person extends Entity
|
||||
@@ -47,9 +48,16 @@ class Person extends Entity
|
||||
array $defs,
|
||||
EntityManager $entityManager,
|
||||
Helper $helper,
|
||||
?ValueAccessorFactory $valueAccessorFactory = null
|
||||
?ValueAccessorFactory $valueAccessorFactory = null,
|
||||
?Relations $relations = null,
|
||||
) {
|
||||
parent::__construct($entityType, $defs, $entityManager, $valueAccessorFactory);
|
||||
parent::__construct(
|
||||
$entityType,
|
||||
$defs,
|
||||
$entityManager,
|
||||
$valueAccessorFactory,
|
||||
$relations
|
||||
);
|
||||
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ use Espo\Core\HookManager;
|
||||
use Espo\Core\Utils\Id\RecordIdGenerator;
|
||||
use Espo\Core\Utils\Metadata;
|
||||
use Espo\Core\Utils\SystemUser;
|
||||
use Espo\ORM\Relation\RelationsMap;
|
||||
|
||||
/**
|
||||
* @deprecated As of v6.0. Not to be extended. Extend Espo\Core\Repositories\Database, or better
|
||||
@@ -97,7 +98,8 @@ class RDB extends \Espo\Core\Repositories\Database implements Injectable /** @ph
|
||||
HookManager $hookManager,
|
||||
ApplicationState $applicationState,
|
||||
RecordIdGenerator $recordIdGenerator,
|
||||
SystemUser $systemUser
|
||||
SystemUser $systemUser,
|
||||
?RelationsMap $relationsMap,
|
||||
) {
|
||||
parent::__construct(
|
||||
$entityType,
|
||||
@@ -107,7 +109,8 @@ class RDB extends \Espo\Core\Repositories\Database implements Injectable /** @ph
|
||||
$hookManager,
|
||||
$applicationState,
|
||||
$recordIdGenerator,
|
||||
$systemUser
|
||||
$systemUser,
|
||||
$relationsMap
|
||||
);
|
||||
|
||||
$this->init();
|
||||
|
||||
@@ -33,6 +33,7 @@ use Espo\Core\ORM\Repository\Option\SaveOption;
|
||||
use Espo\Core\Utils\SystemUser;
|
||||
use Espo\ORM\BaseEntity;
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\Relation\RelationsMap;
|
||||
use Espo\ORM\Repository\RDBRepository;
|
||||
use Espo\Core\ORM\EntityFactory;
|
||||
use Espo\Core\ORM\EntityManager;
|
||||
@@ -84,7 +85,8 @@ class Database extends RDBRepository
|
||||
HookManager $hookManager,
|
||||
ApplicationState $applicationState,
|
||||
RecordIdGenerator $recordIdGenerator,
|
||||
private SystemUser $systemUser
|
||||
private SystemUser $systemUser,
|
||||
?RelationsMap $relationsMap,
|
||||
) {
|
||||
$this->metadata = $metadata;
|
||||
$this->hookManager = $hookManager;
|
||||
@@ -99,7 +101,7 @@ class Database extends RDBRepository
|
||||
$hookMediator = new HookMediator($hookManager);
|
||||
}
|
||||
|
||||
parent::__construct($entityType, $entityManager, $entityFactory, $hookMediator);
|
||||
parent::__construct($entityType, $entityManager, $entityFactory, $hookMediator, $relationsMap);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace Espo\Modules\Crm\Entities;
|
||||
use Espo\Core\Field\DateTime;
|
||||
use Espo\Core\Field\Link;
|
||||
use Espo\Core\Field\LinkMultiple;
|
||||
use Espo\Core\Field\LinkParent;
|
||||
use Espo\Core\ORM\Entity;
|
||||
|
||||
class Call extends Entity
|
||||
@@ -126,4 +127,17 @@ class Call extends Entity
|
||||
/** @var LinkMultiple */
|
||||
return $this->getValueObject('leads');
|
||||
}
|
||||
|
||||
public function setParent(Entity|LinkParent|null $parent): self
|
||||
{
|
||||
if ($parent instanceof LinkParent) {
|
||||
$this->setValueObject('parent', $parent);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->relations->set('parent', $parent);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,4 +143,11 @@ class Lead extends \Espo\Core\Entities\Person
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setCreatedAccount(Account|null $createdAccount): self
|
||||
{
|
||||
$this->relations->set('createdAccount', $createdAccount);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace Espo\Modules\Crm\Entities;
|
||||
use Espo\Core\Field\DateTimeOptional;
|
||||
use Espo\Core\Field\Link;
|
||||
use Espo\Core\Field\LinkMultiple;
|
||||
use Espo\Core\Field\LinkParent;
|
||||
use Espo\Core\ORM\Entity;
|
||||
|
||||
class Meeting extends Entity
|
||||
@@ -131,4 +132,17 @@ class Meeting extends Entity
|
||||
/** @var LinkMultiple */
|
||||
return $this->getValueObject('leads');
|
||||
}
|
||||
|
||||
public function setParent(Entity|LinkParent|null $parent): self
|
||||
{
|
||||
if ($parent instanceof LinkParent) {
|
||||
$this->setValueObject('parent', $parent);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->relations->set('parent', $parent);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,4 +137,17 @@ class Opportunity extends Entity
|
||||
/** @var LinkMultiple */
|
||||
return $this->getValueObject('teams');
|
||||
}
|
||||
|
||||
public function setAccount(Account|Link|null $account): self
|
||||
{
|
||||
if ($account instanceof Link) {
|
||||
$this->setValueObject('account', $account);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->relations->set('account', $account);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace Espo\Modules\Crm\Entities;
|
||||
use Espo\Core\Field\DateTimeOptional;
|
||||
use Espo\Core\Field\Link;
|
||||
use Espo\Core\Field\LinkMultiple;
|
||||
use Espo\Core\Field\LinkParent;
|
||||
use Espo\Core\ORM\Entity;
|
||||
|
||||
class Task extends Entity
|
||||
@@ -91,4 +92,17 @@ class Task extends Entity
|
||||
/** @var string[] */
|
||||
return $this->getLinkMultipleIdList('attachments');
|
||||
}
|
||||
|
||||
public function setParent(Entity|LinkParent|null $parent): self
|
||||
{
|
||||
if ($parent instanceof LinkParent) {
|
||||
$this->setValueObject('parent', $parent);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->relations->set('parent', $parent);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,9 +29,12 @@
|
||||
|
||||
namespace tests\integration\Espo\ORM;
|
||||
|
||||
use Espo\Modules\Crm\Entities\Lead;
|
||||
use Espo\Modules\Crm\Entities\Task;
|
||||
use Espo\ORM\EntityCollection;
|
||||
use Espo\Modules\Crm\Entities\Account;
|
||||
use Espo\Modules\Crm\Entities\Opportunity;
|
||||
use Espo\ORM\Repository\Option\SaveOption;
|
||||
use tests\integration\Core\BaseTestCase;
|
||||
use tests\integration\testClasses\Entities\Account as AccountExtended;
|
||||
use tests\integration\testClasses\Entities\Opportunity as OpportunityExtended;
|
||||
@@ -113,4 +116,80 @@ class RelationsTest extends BaseTestCase
|
||||
|
||||
$this->assertCount(2, $items);
|
||||
}
|
||||
|
||||
public function testSet(): void
|
||||
{
|
||||
$metadata = $this->getMetadata();
|
||||
$metadata->set('entityDefs', Account::ENTITY_TYPE, [
|
||||
'entityClassName' => AccountExtended::class,
|
||||
]);
|
||||
$metadata->save();
|
||||
|
||||
$this->reCreateApplication();
|
||||
|
||||
$em = $this->getEntityManager();
|
||||
|
||||
/** @var Account $account */
|
||||
$account = $em->createEntity(Account::ENTITY_TYPE);
|
||||
|
||||
// belongsTo
|
||||
|
||||
$opp = $em->getRDBRepositoryByClass(Opportunity::class)->getNew();
|
||||
$opp->setAccount($account);
|
||||
$em->saveEntity($opp, [SaveOption::SKIP_ALL => true]);
|
||||
$em->refreshEntity($opp);
|
||||
|
||||
$this->assertEquals($account->getId(), $opp->getAccount()->getId());
|
||||
|
||||
$opp->setAccount(null);
|
||||
$em->saveEntity($opp, [SaveOption::SKIP_ALL => true]);
|
||||
$em->refreshEntity($opp);
|
||||
|
||||
$this->assertNull($opp->getAccount());
|
||||
|
||||
// belongsToParent
|
||||
|
||||
$task = $em->getRDBRepositoryByClass(Task::class)->getNew();
|
||||
$task->setParent($account);
|
||||
$em->saveEntity($task, [SaveOption::SKIP_ALL => true]);
|
||||
$em->refreshEntity($task);
|
||||
|
||||
$this->assertEquals($account->getId(), $task->get('parentId'));
|
||||
$this->assertEquals($account->getEntityType(), $task->get('parentType'));
|
||||
|
||||
$task = $em->getRDBRepositoryByClass(Task::class)->getNew();
|
||||
$task->setParent(null);
|
||||
$em->saveEntity($task, [SaveOption::SKIP_ALL => true]);
|
||||
$em->refreshEntity($task);
|
||||
|
||||
$this->assertNull($task->get('parentId'));
|
||||
$this->assertNull($task->get('parentType'));
|
||||
|
||||
// belongsTo hasOne
|
||||
|
||||
$lead1 = $em->getRDBRepositoryByClass(Lead::class)->getNew();
|
||||
$lead1->setCreatedAccount($account);
|
||||
$em->saveEntity($lead1, [SaveOption::SKIP_ALL => true]);
|
||||
$em->refreshEntity($lead1);
|
||||
|
||||
$this->assertEquals($account->getId(), $lead1->get('createdAccountId'));
|
||||
|
||||
$lead2 = $em->getRDBRepositoryByClass(Lead::class)->getNew();
|
||||
$lead2->setCreatedAccount($account);
|
||||
$em->saveEntity($lead2, [SaveOption::SKIP_ALL => true]);
|
||||
$em->refreshEntity($lead2);
|
||||
|
||||
$this->assertEquals($account->getId(), $lead2->get('createdAccountId'));
|
||||
|
||||
$em->refreshEntity($lead1);
|
||||
|
||||
$this->assertEquals(null, $lead1->get('createdAccountId'));
|
||||
|
||||
$lead2->setCreatedAccount(null);
|
||||
$em->saveEntity($lead2);
|
||||
|
||||
// hasOne
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
namespace tests\integration\testClasses\Entities;
|
||||
|
||||
use Espo\Modules\Crm\Entities\Lead;
|
||||
use Espo\ORM\EntityCollection;
|
||||
|
||||
class Account extends \Espo\Modules\Crm\Entities\Account
|
||||
@@ -37,4 +38,9 @@ class Account extends \Espo\Modules\Crm\Entities\Account
|
||||
{
|
||||
return $this->relations->getMany('opportunities');
|
||||
}
|
||||
|
||||
public function setRelatedOriginalLead(?Lead $lead): void
|
||||
{
|
||||
$this->relations->set('originalLead', $lead);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user