Completed
Push — master ( c5cc72...7c6f56 )
by Jean-Christophe
02:02
created

ModelsCreator::create()   C

Complexity

Conditions 7
Paths 24

Size

Total Lines 29
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 29
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 23
nc 24
nop 1
1
<?php
2
use micro\orm\creator\Model;
3
use micro\orm\creator\Member;
4
use micro\orm\Reflexion;
5
use micro\controllers\Autoloader;
6
7
class ModelsCreator {
8
	private static $config;
9
	private static $pdoObject;
10
	private static $tables=array();
11
	private static $classes=array();
12
13
	private static function init(){
14
		require_once 'app/micro/controllers/Autoloader.php';
15
		Autoloader::register();
16
		$config=require_once 'app/config.php';
17
		self::$config=$config["database"];
18
		self::connect();
19
	}
20
	/**
21
	 * Réalise la connexion à la base de données
22
	 */
23
	private static function connect() {
24
		try {
25
			self::$pdoObject = new \PDO(
26
					'mysql:host=' . self::$config["serverName"] . ';dbname='
27
					. self::$config["dbName"] . ';port:' . self::$config["port"],
28
					self::$config["user"], self::$config["password"]);
29
			self::$pdoObject->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
30
			self::$pdoObject->exec("SET CHARACTER SET utf8");
31
32
		} catch (\PDOException $e) {
33
			print "Error!: " . $e->getMessage() . "<br/>";
34
			die();
35
		}
36
	}
37
38
	public static function create($singleTable=null){
39
		self::init();
40
		self::$tables=self::getTablesName();
41
		if(!is_dir("app/models"))
42
			mkdir("app/models");
43
		new Reflexion();
44
		foreach (self::$tables as $table){
45
			$class=new Model($table);
46
			$fields=self::getFieldsName($table);
47
			$keys=self::getPrimaryKeys($table);
48
			foreach ($fields as $field){
49
				$member=new Member($field);
50
				if(in_array($field, $keys)){
51
					$member->setPrimary();
52
				}
53
				$class->addMember($member);
54
			}
55
			self::$classes[$table]=$class;
56
		}
57
		self::createRelations();
58
		if(isset($singleTable)){
59
			self::createOneClass($singleTable);
60
		}else{
61
			foreach (self::$classes as $table=>$class){
62
				echo "Creating the {$class->getName()} class\n";
63
				self::writeFile("app/models/".$table.".php", $class);
64
			}
65
		}
66
	}
67
68
	private static function createOneClass($singleTable){
69
		if(isset(self::$classes[$singleTable])){
70
			$class=self::$classes[$singleTable];
71
			echo "Creating the {$class->getName()} class\n";
72
			self::writeFile("app/models/".$singleTable.".php", $class);
73
		}else{
74
			echo "The {$singleTable} table does not exist in the database\n";
75
		}
76
	}
77
78
	private static function createRelations(){
79
		foreach (self::$classes as $table=>$class){
80
			$keys=self::getPrimaryKeys($table);
81
			foreach ($keys as $key){
82
				$fks=self::getForeignKeys($table, $key);
83
				foreach ($fks as $fk){
84
					$field=strtolower($table);
85
					$fkTable=$fk["TABLE_NAME"];
86
					self::$classes[$table]->addOneToMany($fkTable."s",$table, self::$classes[$fkTable]->getName());
87
					self::$classes[$fkTable]->addManyToOne($field, $fk["COLUMN_NAME"], $class->getName());
88
				}
89
			}
90
		}
91
		self::createManyToMany();
92
	}
93
94
	private static function createManyToMany(){
95
		foreach (self::$classes as $table=>$class){
96
			if($class->isAssociation()===true){
97
				$members=$class->getManyToOneMembers();
98
				if(sizeof($members)==2){
99
					$manyToOne1=$members[0]->getManyToOne();
100
					$manyToOne2=$members[1]->getManyToOne();
101
					$table1=strtolower($manyToOne1->className);
102
					$table2=strtolower($manyToOne2->className);
103
					$class1=self::$classes[$table1];
104
					$class1->addManyToMany($table2."s", $manyToOne2->className, $table1."s", $table);
105
					$class1->removeMember($table."s");
106
					$class2=self::$classes[$table2];
107
					$class2->addManyToMany($table1."s", $manyToOne1->className, $table2."s", $table);
108
					$class2->removeMember($table."s");
109
					unset(self::$classes[$table]);
110
				}else{
111
					return;
112
				}
113
			}
114
		}
115
	}
116
117
	private static function getTablesName(){
118
		$sql = 'SHOW TABLES';
119
			$query = self::$pdoObject->query($sql);
120
			return $query->fetchAll(PDO::FETCH_COLUMN);
121
	}
122
123
	private static function getFieldsName($tableName) {
124
		$fieldNames=array();
125
		$recordset = self::$pdoObject->query("SHOW COLUMNS FROM `{$tableName}`");
126
		$fields = $recordset->fetchAll(PDO::FETCH_ASSOC);
127
		foreach ($fields as $field) {
128
			$fieldNames[] = $field['Field'];
129
		}
130
		return $fieldNames;
131
	}
132
133
	private static function getPrimaryKeys($tableName){
134
		$fieldkeys=array();
135
		$recordset = self::$pdoObject->query("SHOW KEYS FROM `{$tableName}` WHERE Key_name = 'PRIMARY'");
136
		$keys = $recordset->fetchAll(PDO::FETCH_ASSOC);
137
		foreach ($keys as $key) {
138
			$fieldkeys[] = $key['Column_name'];
139
		}
140
		return $fieldkeys;
141
	}
142
143
	private static function getForeignKeys($tableName,$pkName){
144
		$recordset = self::$pdoObject->query("SELECT *
145
												FROM
146
												 information_schema.KEY_COLUMN_USAGE
147
												WHERE
148
												 REFERENCED_TABLE_NAME = '".$tableName."'
149
												 AND REFERENCED_COLUMN_NAME = '".$pkName."'
150
												 AND TABLE_SCHEMA = '".self::$config["dbName"]."';");
151
		return $recordset->fetchAll(PDO::FETCH_ASSOC);
152
	}
153
154
	private static function writeFile($filename,$data){
155
		return file_put_contents($filename,$data);
156
	}
157
}
158