vendor\project-biz\database-bundle\src\Database\TableInfo.php line 24

Open in your IDE?
  1. <?php
  2. namespace ProjectBiz\DatabaseBundle\Database;
  3. use Doctrine\DBAL\Query\QueryBuilder;
  4. use Symfony\Contracts\Translation\TranslatorInterface;
  5. class TableInfo extends TableAndViewInfo
  6. {
  7.     private $descriptor;
  8.     private $cachedPrimaryKey;
  9.     private $cachedColumns;
  10.     private $cachedColumnDefinitions;
  11.     private $cachedColumnSelectionForView;
  12.     public function __construct(
  13.         TableDescriptor $descriptor,
  14.         DatabaseSchemaCache $databaseSchemaCache,
  15.         TableHelper $tableHelper,
  16.         TranslatorInterface $translator
  17.     ) {
  18.         $this->descriptor $descriptor;
  19.         parent::__construct(
  20.             $descriptor->getMainTablename(),
  21.             $databaseSchemaCache,
  22.             $tableHelper,
  23.             $translator
  24.         );
  25.         $this->cachedColumnDefinitions = [];
  26.     }
  27.     /**
  28.      * @inheritdoc
  29.      */
  30.     public function getPrimaryKey()
  31.     {
  32.         return $this->databaseSchemaCache->getPrimaryKey($this->getTablename());
  33.     }
  34.     /**
  35.      * @inheritdoc
  36.      */
  37.     public function getColumns()
  38.     {
  39.       
  40.         if (!isset($this->cachedColumns)) {
  41.             // Get definied columns and map them to their view-names
  42.             $columns = [];
  43.             /** @var \ProjectBiz\DatabaseBundle\Entity\ColumnDefinition $columnDefinition */
  44.             foreach ($this->getColumnDefinitions() as $columnDefinition) {
  45.                 if ($columnDefinition->getTable() == $this->descriptor->getMainTablename()) {
  46.                     $columns[] = $columnDefinition->getColumn();
  47.                 }
  48.                 foreach ($this->descriptor->getJoins() as $join) {
  49.                     if ($columnDefinition->getTable() == $join['joinTable']) {
  50.                         $columns[] = strtoupper($join['joinTableAlias']) . '__' $columnDefinition->getColumn();
  51.                     }
  52.                 }
  53.             }
  54.             $this->cachedColumns $columns;
  55.         }
  56.         return $this->cachedColumns;
  57.     }
  58.     /**
  59.      * @inheritdoc
  60.      */
  61.     public function getColumnDefinitions()
  62.     {
  63.       //  var_dump(55555555555555);
  64.         if (!is_a($this->descriptor'ProjectBiz\DatabaseBundle\Database\TableDescriptor')) {
  65.             return $this->databaseSchemaCache->getColumnDefinitionsByTable($this->getTablename());
  66.         }
  67.         else {
  68.             if (!array_key_exists($this->descriptor->getUniqueName(), $this->cachedColumnDefinitions)) {
  69.                 $this->cachedColumnDefinitions[$this->descriptor->getUniqueName()] = [];
  70.                 //var_dump($this->descriptor->getTableNames());
  71.                 foreach ($this->descriptor->getTableNames() as $tablename) {
  72.                     $this->cachedColumnDefinitions[$this->descriptor->getUniqueName()] = array_merge(
  73.                         $this->cachedColumnDefinitions[$this->descriptor->getUniqueName()],
  74.                         $this->databaseSchemaCache->getColumnDefinitionsByTable($tablename)
  75.                     );
  76.                 }
  77.             }
  78.             return $this->cachedColumnDefinitions[$this->descriptor->getUniqueName()];
  79.         }
  80.     }
  81.     /*
  82.      * Get the columns that are writeable with the given rights
  83.      * @param $rights
  84.      * @return \ProjectBiz\DatabaseBundle\Database\Column[]
  85.      *
  86.     public function getWriteableColumns($rights) {
  87.         if (!isset($this->writeableColumns[$rights])) {
  88.             $columns = $this->getValidColumns();
  89.             $this->writeableColumns[$rights] = new ColumnList();
  90.             $editableJoins = array('mt' => true);
  91.             foreach($this->descriptor->getJoins() as $join) {
  92.                 if (isset($join['editable'])) {
  93.                     $editableJoins[$join['joinTableAlias']] = true;
  94.                 }
  95.             }
  96.             $colDefs = $this->getColumnDefinitions();
  97.             foreach ($columns->getColumns() as $column) {
  98.                 if (
  99.                     isset($colDefs[$column->getDefinitionName()]) &&
  100.                     $colDefs[$column->getDefinitionName()]->checkWriteRights($rights) &&
  101.                     isset($editableJoins[$column->getTableAlias()])
  102.                 ) {
  103.                     $this->writeableColumns[$rights]->addColumnObject($column);
  104.                 }
  105.             }
  106.         }
  107.         return $this->writeableColumns[$rights];
  108.     }
  109.     */
  110.     /**
  111.      * @inheritdoc
  112.      */
  113.     public function buildFrom(QueryBuilder $builder$mainTableName 'mt')
  114.     {
  115.         $builder->from($this->getInternalTablename(), $mainTableName);
  116.         $this->buildJoins($builder$mainTableName);
  117.     }
  118.     /**
  119.      * @inheritdoc
  120.      */
  121.     public function buildJoins(QueryBuilder $builder$mainTableName 'mt')
  122.     {
  123.         foreach ($this->descriptor->getJoins() as $join) {
  124.             // @todo: check, if join is allowed (column rights - and maybe object rights (!?))
  125.             $fromAlias = ($join['fromAlias'] == 'mt')?$mainTableName:$join['fromAlias'];
  126.             switch ($join['type']) {
  127.                 case 'join':
  128.                     $builder->join(
  129.                         $fromAlias,
  130.                         $this->databaseSchemaCache->getPrefix() . $join['joinTable'],
  131.                         $join['joinTableAlias'],
  132.                         $join['condition']
  133.                     );
  134.                     break;
  135.                 case 'innerJoin':
  136.                     $builder->innerJoin(
  137.                         $fromAlias,
  138.                         $this->databaseSchemaCache->getPrefix() . $join['joinTable'],
  139.                         $join['joinTableAlias'],
  140.                         $join['condition']
  141.                     );
  142.                     break;
  143.                 case 'leftJoin':
  144.                     $builder->leftJoin(
  145.                         $fromAlias,
  146.                         $this->databaseSchemaCache->getPrefix() . $join['joinTable'],
  147.                         $join['joinTableAlias'],
  148.                         $join['condition']
  149.                     );
  150.                     break;
  151.                 case 'rightJoin':
  152.                     $builder->rightJoin(
  153.                         $fromAlias,
  154.                         $this->databaseSchemaCache->getPrefix() . $join['joinTable'],
  155.                         $join['joinTableAlias'],
  156.                         $join['condition']
  157.                     );
  158.                     break;
  159.             }
  160.         }
  161.     }
  162.     public function getColumnSelectionForView()
  163.     {
  164.         /**
  165.          * @inheritdoc
  166.          */
  167.         if (!isset($this->cachedColumnSelectionForView)) {
  168.             // Get definied columns and map them to their view-names
  169.             $columns = [];
  170.             /** @var \ProjectBiz\DatabaseBundle\Entity\ColumnDefinition $columnDefinition */
  171.             foreach ($this->getColumnDefinitions() as $columnDefinition) {
  172.                 if ($columnDefinition->getTable() == $this->descriptor->getMainTablename()) {
  173.                     $columnName $columnDefinition->getColumn();
  174.                     /*
  175.                      * Hide the column and all referenced columns in view-editor when the user rights are not sufficient.
  176.                      */
  177.                     if (!$columnDefinition->checkReadRights($this->userRights)) {
  178.                         continue;
  179.                     }
  180.                     $columns[] = $columnName;
  181.                     $columns $this->addReferencedColumns($columns$columnName$columnDefinition);
  182.                 }
  183.                 foreach ($this->descriptor->getJoins() as $join) {
  184.                     if ($columnDefinition->getTable() == $join['joinTable']) {
  185.                         $columnName strtoupper($join['joinTableAlias']) . '__' $columnDefinition->getColumn();
  186.                         $columns[] = $columnName;
  187.                         $columns $this->addReferencedColumns($columns$columnName$columnDefinition);
  188.                     }
  189.                 }
  190.             }
  191.             $this->cachedColumnSelectionForView $columns;
  192.         }
  193.         return $this->cachedColumnSelectionForView;
  194.     }
  195.     public function getInternalTablename() {
  196.         return $this->databaseSchemaCache->getPrefix() . $this->getTablename();
  197.     }
  198.     /**
  199.      * Get the columnnames stored in »TableDefinition_MainDescriptionColumns«.
  200.      *
  201.      * @param bool $strict Throw an exception if »TableDefinition_MainDescriptionColumns« is empty.
  202.      * @return array|null
  203.      * @throws \Exception
  204.      */
  205.     public function getMainDescriptionColumns(bool $strict true)
  206.     {
  207.         $tableDefinitions $this->databaseSchemaCache->getTableDefinitions();
  208.         if (!$tableDefinitions[$this->tablename]['TableDefinition_MainDescriptionColumns']) {
  209.             if ($strict) {
  210.                 throw new \Exception("»TableDefinition_MainDescriptionColumns« must not be empty.");
  211.             } else {
  212.                 return null;
  213.             }
  214.         }
  215.         $mainDescriptionColumns json_decode($tableDefinitions[$this->tablename]['TableDefinition_MainDescriptionColumns']);
  216.         if (!$mainDescriptionColumns) {
  217.             throw new \Exception('Wrong json in »TableDefinition_MainDescriptionColumns«: ' $tableDefinitions[$this->tablename]['TableDefinition_MainDescriptionColumns']);
  218.         }
  219.         return $mainDescriptionColumns;
  220.     }
  221.     /**
  222.      * Retrieve the values of a record as array which match the main description columns.
  223.      *
  224.      * @param array $data The data of the record.
  225.      * @param bool $strict Will throw an exception if »TableDefinition_MainDescriptionColumns« is empty.
  226.      * @return array|null
  227.      */
  228.     public function getMainDescription($databool $strict true)
  229.     {
  230.         $mainDescriptionColumns $this->getMainDescriptionColumns($strict);
  231.         if ($mainDescriptionColumns === null) {
  232.             return null;
  233.         }
  234.         $mainDescription = [];
  235.         foreach ($mainDescriptionColumns as $descriptionColumn) {
  236.             if ($data[$descriptionColumn]) {
  237.                 $mainDescription[] = $data[$descriptionColumn];
  238.             }
  239.         }
  240.         return $mainDescription;
  241.     }
  242. }