Former.php 3.69 KB
<?php
namespace Hood\Dao\Db\PostgreSQL;
/**
 * Created by PhpStorm.
 * User: Zip
 * Date: 15/12/7
 * Time: 18:38
 */
class Former extends PDOConnection
{
    private $namespace = '';

    private $formerFileName = 'Former.php';

    private $dir = './';

    private $sql = 'SELECT table_name,column_name,is_nullable,data_type,udt_name,character_maximum_length,column_default FROM INFORMATION_SCHEMA.Columns WHERE table_name = :table_name';

    public function getTableData($table)
    {
        return parent::fetchAll($this->sql, array('table_name' => $table));
    }

    public function setDir($dir)
    {
        $this->dir = $dir;
        return $this;
    }

    public function setNamespace($namespace)
    {
        $this->namespace = $namespace;
        return $this;
    }

    public function setData(array $tableData)
    {
        $attributesData = array();
        $funData = array();
        foreach ($tableData as $key => $val) {
            $attributesType = $this->getType($val['data_type']);
            $attributesData[] = $this->drawFunCode($key, $attributesType, $val['column_default']);
            $funData[] = $this->drawFun($this->drawFunName($key), $key, $attributesType);
        }
        $attributesString = implode("\n", $attributesData);
        $funString = implode("\n", $funData);
        $this->writeFormer($attributesString, $funString);
    }

    private function drawFunCode($attributes, $attributesType, $default = '')
    {
        $_attributesType = str_replace(array(')', '('), '', $attributesType);
        if (empty($default)) {
            return "
    /**
     * @var $_attributesType
     */
    private $$attributes;";
        } else {
            return "
    /**
     * @var $_attributesType
     */
    private $$attributes = $default;";
        }

    }

    /**
     * @param $funName
     * @return string
     */
    public function drawFunName($funName)
    {
        $funNameList = explode('_', $funName);
        $funList = array();
        foreach ($funNameList as $fun) {
            $funList[] = ucfirst($fun);
        }
        return implode('', $funList);
    }

    /**
     * @param $attributesType
     * @return string
     */
    public function getType($attributesType)
    {
        switch ($attributesType) {
            case 'int2':
            case 'int4':
            case 'int8':
            case 'interval':
                $type = '(int)';
                break;
            case 'float4':
            case 'float8':
                $type = '(float)';
                break;
            default:
                $type = '(string)';
        }
        return $type;
    }

    public function drawFun($funName, $attributesName, $attributesType)
    {
        $_attributesType = str_replace(array(')', '('), '', $attributesType);
        return "
    /**
     * get $attributesName
     * @return $_attributesType
     */
    public function get{$funName}(){
        return \$this->$attributesName;
    }

    /**
     * @param $_attributesType \$value
     * @return \$this
     */
    public function set{$funName}(\$value){
        \$this->$attributesName = $attributesType\$value;
        return \$this;
    }";
    }

    private function writeFormer($attributesData, $funData, $formerName = 'Former')
    {
        if (empty($this->namespace)) {
            $code = <<<EOT
<?php\n
class $formerName
{
$attributesData
$funData

}
EOT;
        } else {
            $code = <<<EOT
<?php\n
namespace $this->namespace;

class $formerName
{
$attributesData
$funData

}
EOT;
        }
        file_put_contents($this->dir . $this->formerFileName, $code);
    }

    public function setFormerFileName($formerFileName)
    {
        $this->formerFileName = $formerFileName;
        return $this;
    }
}