From 365f2ff580fb2e98c24c58f4d2cadfe1f461a9fa Mon Sep 17 00:00:00 2001 From: sheychen Date: Wed, 2 May 2018 21:28:48 +0200 Subject: [PATCH] Create Update --- src/Database.php | 12 +++++++++ src/Model.php | 56 ++++++++++++++++++++++++++++++++++++++++-- src/Request/Create.php | 2 -- src/Request/Update.php | 39 +++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/Request/Update.php diff --git a/src/Database.php b/src/Database.php index 57a2099..1aee3d8 100644 --- a/src/Database.php +++ b/src/Database.php @@ -48,6 +48,14 @@ class Database{ return $insert; } + public function update(array $fields = null){ + $update = new Request\Update($this); + if(isset($fields)) + return $update->fields($fields); + + return $update; + } + public function create(string $table = null){ $create = new Request\Create($this); if(isset($table)) @@ -63,5 +71,9 @@ class Database{ return $drop; } + + public function getLastInsertId(){ + return $this->pdo->lastInsertId(); + } //TODO update, delete } \ No newline at end of file diff --git a/src/Model.php b/src/Model.php index 688b86d..b3e5efd 100644 --- a/src/Model.php +++ b/src/Model.php @@ -31,7 +31,7 @@ class Model{ public function __construct(array $data = [], bool $useColumns = false){ foreach (static::getFields() as $field => $options) { $column = $useColumns ? static::getColumn($field) : $field; - $value = static::convertField(isset($data[$column]) ? $data[$column] : null, $field); + $value = static::convertField(isset($data[$column]) ? $data[$column] : (isset($options['default']) ? $options['default'] : null), $field); $this->fields[$field] = [ 'value' => $value, 'modified' => false @@ -137,6 +137,30 @@ class Model{ return $columns; } + public static function getPrimaryColumns(bool $sql = true): array{ + $fields = static::getFields(); + $columns = []; + foreach ($fields as $field => $options) { + if(isset($options['primary']) && $options['primary']){ + $column = static::getColumn($field); + $columns[] = $sql ? '`'.static::TABLE.'`.`'.$column.'`' : $column; + } + } + return $columns; + } + + public function getModifiedColumns(bool $sql = true): array{ + $fields = static::getFields(); + $columns = []; + foreach ($fields as $field => $options) { + if($this->fields[$field]['modified']){ + $column = static::getColumn($field); + $columns[] = $sql ? '`'.static::TABLE.'`.`'.$column.'`' : $column; + } + } + return $columns; + } + public function getValues(){ $values = []; foreach ($this->fields as $field => $data) { @@ -145,6 +169,23 @@ class Model{ return $values; } + public function getModifiedValues(){ + $values = []; + foreach ($this->fields as $field => $data) { + if($data['modified']) $values[] = $data['value']; + } + return $values; + } + + public function getPrimaryValues(){ + $values = []; + foreach ($this->fields as $field => $data) { + $options = static::getOptions($field); + if(isset($options['primary']) && $options['primary']) $values[] = $data['value']; + } + return $values; + } + protected static function convertField($data, $field){ $options = static::getOptions($field); if(is_null($data)){ @@ -163,6 +204,9 @@ class Model{ if(isset($options['lenght']) && strlen($data) > $options['lenght']) throw new DatabaseException('data is to long in field : '.$field); break; + case 'bit': + $data = boolval($data); //MAYBE: E_NOTICE on strange types + break; default: throw new DatabaseException('unknown type in field : '.$field); break; @@ -201,7 +245,15 @@ class Model{ } public function runInsert(){ - static::insert()->run($this->getValues()); + return static::insert()->run($this->getValues()); + } + + public function runUpdate(){ + $req = Connection::get(static::DATABASE) + ->update(static::getModifiedColumns()) + ->table(static::TABLE) + ->where(implode(' AND ', array_map(function($field){ return $field.' = ?'; }, static::getPrimaryColumns()))) + ->run(array_merge($this->getModifiedValues(), $this->getPrimaryValues())); } public static function create(): Request\Create{ diff --git a/src/Request/Create.php b/src/Request/Create.php index 3be9bae..44593a8 100644 --- a/src/Request/Create.php +++ b/src/Request/Create.php @@ -48,8 +48,6 @@ class Create extends Request{ $uniques ) )."\n)"; - - //TODO: foreign keys } public function run(array $values = null){ diff --git a/src/Request/Update.php b/src/Request/Update.php new file mode 100644 index 0000000..f200624 --- /dev/null +++ b/src/Request/Update.php @@ -0,0 +1,39 @@ +fields = $add ? array_merge($this->fields, $fields) : $fields; + return $this; + } + + public function table(string $table): Update{ + $this->table = $table; + return $this; + } + + public function where(string $where, bool $add = false): Update{ + $this->where = $add && $this->where ? '('.$this->where.') AND ('.$where.')' : $where; + return $this; + } + + public function sql(){ + if(!isset($this->table)) + throw new DatabaseException('Any table set'); + + return 'UPDATE `'.$this->table."`\n". + 'SET '.implode(', ', array_map(function($field){ return $field.' = ?'; }, $this->fields))."\n". + (isset($this->where) ? ('WHERE '.$this->where) : ''); + } + + public function run(array $values = null){ + return parent::execute($this->sql(), $values); + } +} \ No newline at end of file