Exemplo n.º 1
0
 /**
  * Delete entity from the database.
  *
  * @param \Lokhman\Silex\ARM\AbstractEntity $entity
  *
  * @throws \Exception
  * @return integer
  *         Number of affected rows
  */
 public function delete(AbstractEntity $entity)
 {
     $this->assert($entity);
     // check if primary key is defined and is not NULL
     $primary = $this->metadata->getPrimary();
     if (!isset($entity[$primary])) {
         self::raise('Primary key is required to update the entity.');
     }
     try {
         $this->db->beginTransaction();
         // pre-delete event
         $this->preDelete($entity);
         // update position indexes
         if ($this->metadata->hasPosition()) {
             $position = $entity[$this->metadata->getPosition()];
             $this->positionShift($entity, $position + 1, null, -1);
         }
         if ($this->translate) {
             // delete all translations for entity
             $this->db->delete($this->app['arm.trans'], ['_table' => $this->table, '_key' => $entity[$primary]]);
         }
         // attempt to delete entity
         $result = $this->db->delete($this->table, [$primary => $entity[$primary]]);
         // delete all files
         $this->unlink($entity);
         $this->db->commit();
         // unset primary key
         unset($entity[$primary]);
         // post-delete event
         $this->postDelete($entity);
     } catch (\Exception $ex) {
         $this->rollback();
         throw $ex;
     }
     return $result;
 }
Exemplo n.º 2
0
 /**
  * Static method for generating metadata array for current entity.
  *
  * @final
  * @static
  *
  * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform
  * @param string                                    $updir [optional]
  *
  * @throws \Lokhman\Silex\ARM\Exception\EntityException
  * @return void
  */
 public static final function init(AbstractPlatform $platform, $updir = null)
 {
     if (isset(self::$metadata[static::class])) {
         self::raise('Entity class was already initialised.');
     }
     $metadata = new Metadata();
     $metadata->setPlatform($platform);
     $metadata->setUpdir($updir);
     foreach (static::schema() as $column => $types) {
         if ('' == ($column = trim($column))) {
             self::raise('Column name cannot be empty.');
         }
         if (!is_string($types) || '' == ($types = trim($types))) {
             self::raise('Schema type should be a valid string.');
         }
         $types = preg_split('/\\s+/', $types);
         foreach (array_unique($types) as $type) {
             if ($type == self::PRIMARY) {
                 if ($metadata->hasPrimary()) {
                     self::raise('Multiple primary keys defined.');
                 }
                 $metadata->setPrimary($column);
             } elseif ($type == self::REQUIRED) {
                 $metadata->addRequired($column);
             } elseif ($type == self::TRANS) {
                 $metadata->addTrans($column);
             } elseif ($type == self::FILE) {
                 if ($updir === null) {
                     self::raise('Configure "arm.updir" setting to use file columns.');
                 }
                 if (in_array(self::TRANS, $types)) {
                     self::raise('File column cannot be translatable.');
                 }
                 if (!in_array(Type::SIMPLE_ARRAY, $types)) {
                     // if not SIMPLE_ARRAY, file is always STRING
                     $metadata->addSchema($column, Type::STRING);
                 }
                 $metadata->addFile($column);
             } elseif ($type == self::GROUP) {
                 $metadata->addGroup($column);
             } elseif ($type == self::POSITION) {
                 if ($metadata->hasPosition()) {
                     self::raise('Multiple position columns defined.');
                 }
                 if (in_array(self::REQUIRED, $types)) {
                     self::raise('Position column cannot be required.');
                 }
                 if (in_array(self::TRANS, $types)) {
                     self::raise('Position column cannot be translatable.');
                 }
                 if (in_array(self::GROUP, $types)) {
                     self::raise('Position column cannot be used as group.');
                 }
                 // position is always INTEGER
                 $metadata->addSchema($column, Type::INTEGER);
                 $metadata->setPosition($column);
             } elseif (Type::hasType($type)) {
                 if ($metadata->hasSchema($column)) {
                     self::raise('Column "' . $column . '" already has type.');
                 }
                 $metadata->addSchema($column, $type);
             } else {
                 self::raise('Unknown type "' . $type . '" in schema.');
             }
         }
         if (!$metadata->hasSchema($column)) {
             self::raise('Column "' . $column . '" must have type defined.');
         }
     }
     if (!$metadata->hasPrimary()) {
         self::raise('Entity must have a primary column.');
     }
     self::$metadata[static::class] = $metadata->lock();
 }