diff --git a/application/Espo/Core/Utils/Database/Converters/Links.php b/application/Espo/Core/Utils/Database/Converters/Links.php index 3e36c8bb4b..97370525f8 100644 --- a/application/Espo/Core/Utils/Database/Converters/Links.php +++ b/application/Espo/Core/Utils/Database/Converters/Links.php @@ -15,7 +15,7 @@ class Links { $this->metadata = $metadata; - $this->relations = new Relations(); + $this->relations = new Relations($this->metadata); } protected function getMetadata() diff --git a/application/Espo/Core/Utils/Database/Converters/Orm.php b/application/Espo/Core/Utils/Database/Converters/Orm.php index 487acd2ebc..6a2c64979e 100644 --- a/application/Espo/Core/Utils/Database/Converters/Orm.php +++ b/application/Espo/Core/Utils/Database/Converters/Orm.php @@ -29,6 +29,10 @@ class Orm protected $fieldAccordances = array( 'type' => 'type', 'maxLength' => 'len', + 'autoincrement' => 'autoincrement', + 'notStorable' => 'notStorable', + 'link' => 'relation', + 'field' => 'foreign', //todo change "foreign" to "field" 'default' => array( 'condition' => '^javascript:', 'conditionEquals' => false, diff --git a/application/Espo/Core/Utils/Database/Converters/Relations.php b/application/Espo/Core/Utils/Database/Converters/Relations.php index 5fc8dab983..5aa82c9a6d 100644 --- a/application/Espo/Core/Utils/Database/Converters/Relations.php +++ b/application/Espo/Core/Utils/Database/Converters/Relations.php @@ -8,6 +8,19 @@ use Espo\Core\Utils\Util, class Relations { + private $metadata; + + public function __construct(\Espo\Core\Utils\Metadata $metadata) + { + $this->metadata = $metadata; + } + + protected function getMetadata() + { + return $this->metadata; + } + + protected function getSortEntities($entity1, $entity2) { $entities = array( @@ -20,6 +33,7 @@ class Relations return $entities; } + protected function getJoinTable($tableName1, $tableName2) { $tables = $this->getSortEntities($tableName1, $tableName2); @@ -28,6 +42,25 @@ class Relations } + protected function getForeignField($name, $entityName) + { + $foreignField = $this->getMetadata()->get('entityDefs.'.$entityName.'.fields.'.$name); + + if ($foreignField['type'] != Entity::VARCHAR) { + $fieldDefs = $this->getMetadata()->get('fields.'.$foreignField['type']); + $naming = isset($fieldDefs['naming']) ? $fieldDefs['naming'] : 'postfix'; + + if (isset($fieldDefs['actualFields']) && is_array($fieldDefs['actualFields'])) { + $foreignFieldArray = array(); + foreach($fieldDefs['actualFields'] as $fieldName) { + $foreignFieldArray[] = Util::getNaming($name, $fieldName, $naming); + } + return $foreignFieldArray; + } + } + + return $name; + } //todo sedine in foreign fieldDefs a key for current @@ -96,6 +129,7 @@ class Relations 'type' => Entity::FOREIGN, 'relation' => $params['link']['name'], 'notStorable' => true, + 'foreign' => $this->getForeignField('name', $foreignParams['entityName']), ), $params['link']['name'].'Id' => array( 'type' => Entity::FOREIGN_ID, @@ -112,9 +146,9 @@ class Relations ), ); - if (isset($params['link']['params']['foreign'])) { //??? + /*if (isset($params['link']['params']['foreign'])) { //??? $relation[$params['entityName']] ['fields'] [$params['link']['name'].'Name'] ['foreign'] = $params['link']['params']['foreign']; - } + } */ return $relation; } diff --git a/application/Espo/Core/Utils/Metadata.php b/application/Espo/Core/Utils/Metadata.php index 3c2a82837c..b292500f13 100644 --- a/application/Espo/Core/Utils/Metadata.php +++ b/application/Espo/Core/Utils/Metadata.php @@ -207,7 +207,7 @@ class Metadata $espoMetadataFile = Util::concatPath($this->getMetaConfig()->cachePath, 'ormMetadata.php'); - if (!file_exists($espoMetadataFile)) { + if (!file_exists($espoMetadataFile) || !$this->getConfig()->get('useCache')) { $this->getConverter()->process(); } diff --git a/application/Espo/Resources/metadata/fields/foreign.json b/application/Espo/Resources/metadata/fields/foreign.json new file mode 100644 index 0000000000..ecf5eb49e4 --- /dev/null +++ b/application/Espo/Resources/metadata/fields/foreign.json @@ -0,0 +1,5 @@ +{ + "database":{ + "notStorable":true + } +} diff --git a/application/Espo/Resources/metadata/fields/personName.json b/application/Espo/Resources/metadata/fields/personName.json index 34e3b10922..cf0f9b09c4 100644 --- a/application/Espo/Resources/metadata/fields/personName.json +++ b/application/Espo/Resources/metadata/fields/personName.json @@ -6,10 +6,10 @@ ], "fields":{ "salutation":{ - "type":"varchar" + "type":"enum" }, "first":{ - "type":"enum" + "type":"varchar" }, "last":{ "type":"varchar"