/** * 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; }
/** * 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(); }