<?php
/**
* *
* * please don't remove this comment block
* *
* * @author phptricks Team - Mohammad Anzawi
* * @author_uri https://phptricks.org
* * @uri https://github.com/anzawi/php-database-class
* * @version 5.0.0
* * @licence MIT -> https://opensource.org/licenses/MIT
* * @package PHPtricks\Orm
*
*/
namespace PHPtricks\Orm\DDL;
/**
* Trait Base
*
* @package PHPtricks\Orm\DDL
*/
trait Base
{
use Vars;
use Create;
use Alter;
/**
* set _schema var value
*
* @param array $structures the structure of table
*
* @return object return Collection object
*/
public function schema($structures = [])
{
if (count($structures)) // check if isset $structures
{
/**
* to store columns structures
*
* @var array
*/
$schema = [];
foreach ($structures as $column => $options) {
$type = $options; // the type is the prototype of column
$constraints = ''; // store all constraints for one column
// check if we have a constraints
if ( ! strpos($options, '|') === false) {
$constraints = explode('|',
$options); // the separator to constraints is --> | <--
$type = $constraints[0]; // the type is first key
unset($constraints[0]); // remove type from constraints
$constraints = implode(' ',
$constraints); // convert constraints to string
$constraints = strtr($constraints, [
'primary' => 'PRIMARY KEY',
// change (primary to PRIMARY KEY -> its valid constraint in sql)
'increment' => 'AUTO_INCREMENT', // same primary
'not_null' => 'NOT NULL', // same primary
]);
}
// check if type is 'increments' we want to change it to integer and add some constraints like primary key ,not null, unsigned and auto increment
($type == 'increments' ?
$type = "INT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL"
: null);
// check if type of column is string change it to valid sql type (VARCHAR and set length)
// ['username' => 'string:255'] convert to username VARCHAR(255)
if (strpos($type, 'string') !== false) {
$type = explode(':', $type);
$type = "VARCHAR({$type[1]})";
}
// check if column has a default value
// ['username' => 'string:255|default:no-name'] convert to username VARCHAR(255) DEFAULT 'no name'
if (strpos($constraints, 'default') !== false) {
preg_match("/(:)[A-Za-z0-9](.*)+/", $constraints, $match);
$match[0] = str_replace(':', '', $match[0]);
$temp = str_replace('-', ' ', $match[0]);
$constraints = str_replace(":".$match[0], " '{$temp}' ",
$constraints);
}
// add key to schema var contains column _type constraints
// ex: username VARCHAR(255) DEFUALT 'no name' NOT NULL
$schema[] = "$column $type ".$constraints;
}
// set _schema the all columns structure
$this->_schema = '('.implode(",", $schema).')';
return $this; // return DB object
}
return null; // return null
}
/**
* check if table is exist in database
*
* @param string $table
*
* @return bool
*/
/* public function tableExist($table = '')
{
$table = $this->query("SHOW TABLES LIKE '{$table}'")->results();
if (!is_null($table) && count($table)) {
return true;
}
return false;
}*/
/**
* @return mixed
*/
public function showMeSchema()
{
return $this->_schema;
}
/**
* @param string $error
*
* @return string
*/
protected function setError(string $error)
{
return $this->_errors[] = $error;
}
/**
* @return string
*/
public function getErrors()
{
return implode('\n', $this->_errors);
}
}
|