Passed
Push — master ( 2d3687...a40d55 )
by Jean-Christophe
06:54
created

DAOUpdatesTrait::insert()   B

Complexity

Conditions 6
Paths 36

Size

Total Lines 32
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 26
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 32
ccs 26
cts 26
cp 1
rs 8.8817
c 0
b 0
f 0
cc 6
nc 36
nop 2
crap 6
1
<?php
2
3
namespace Ubiquity\orm\traits;
4
5
use Ubiquity\db\SqlUtils;
6
use Ubiquity\events\DAOEvents;
7
use Ubiquity\events\EventsManager;
8
use Ubiquity\log\Logger;
9
use Ubiquity\orm\OrmUtils;
10
use Ubiquity\orm\parser\ManyToManyParser;
11
use Ubiquity\orm\parser\Reflexion;
12
13
/**
14
 * Trait for DAO Updates (Create, Update, Delete)
15
 * Ubiquity\orm\traits$DAOUpdatesTrait
16
 * This class is part of Ubiquity
17
 *
18
 * @author jcheron <[email protected]>
19
 * @version 1.0.1
20
 *
21
 */
22
trait DAOUpdatesTrait {
23
24
	/**
25
	 * Deletes the object $instance from the database
26
	 *
27
	 * @param object $instance instance à supprimer
28
	 */
29 4
	public static function remove($instance) {
30 4
		$tableName = OrmUtils::getTableName ( get_class ( $instance ) );
31 4
		$keyAndValues = OrmUtils::getKeyFieldsAndValues ( $instance );
32 4
		return self::removeByKey_ ( $tableName, $keyAndValues );
33
	}
34
35
	/**
36
	 *
37
	 * @param string $tableName
38
	 * @param array $keyAndValues
39
	 * @return int the number of rows that were modified or deleted by the SQL statement you issued
40
	 */
41 4
	private static function removeByKey_($tableName, $keyAndValues) {
42 4
		$sql = "DELETE FROM " . $tableName . " WHERE " . SqlUtils::getWhere ( $keyAndValues );
43 4
		Logger::info ( "DAOUpdates", $sql, "delete" );
44 4
		$statement = self::$db->prepareStatement ( $sql );
45 4
		foreach ( $keyAndValues as $key => $value ) {
46 4
			self::$db->bindValueFromStatement ( $statement, $key, $value );
47
		}
48
		try {
49 4
			if ($statement->execute ()) {
50 3
				return $statement->rowCount ();
51
			}
52 1
		} catch ( \PDOException $e ) {
53 1
			Logger::warn ( "DAOUpdates", $e->getMessage (), "delete" );
54 1
			return;
55
		}
56
		return;
57
	}
58
59
	/**
60
	 *
61
	 * @param string $tableName
62
	 * @param string $where
63
	 * @return boolean|int the number of rows that were modified or deleted by the SQL statement you issued
64
	 */
65
	private static function remove_($tableName, $where) {
66
		$sql = "DELETE FROM `" . $tableName . "` " . SqlUtils::checkWhere ( $where );
67
		Logger::info ( "DAOUpdates", $sql, "delete" );
68
		$statement = self::$db->prepareStatement ( $sql );
69
		try {
70
			if ($statement->execute ()) {
71
				return $statement->rowCount ();
72
			}
73
		} catch ( \PDOException $e ) {
74
			Logger::warn ( "DAOUpdates", $e->getMessage (), "delete" );
75
			return false;
76
		}
77
	}
78
79
	/**
80
	 * Deletes all instances from $modelName matching the condition $where
81
	 *
82
	 * @param string $modelName
83
	 * @param string $where
84
	 * @return int|boolean
85
	 */
86
	public static function deleteAll($modelName, $where) {
87
		$tableName = OrmUtils::getTableName ( $modelName );
88
		return self::remove_ ( $tableName, $where );
89
	}
90
91
	/**
92
	 * Deletes all instances from $modelName corresponding to $ids
93
	 *
94
	 * @param string $modelName
95
	 * @param array|int $ids
96
	 * @return int|boolean
97
	 */
98
	public static function delete($modelName, $ids) {
99
		$tableName = OrmUtils::getTableName ( $modelName );
100
		$pk = OrmUtils::getFirstKey ( $modelName );
101
		if (! \is_array ( $ids )) {
102
			$ids = [ $ids ];
103
		}
104
		$where = SqlUtils::getMultiWhere ( $ids, $pk );
105
		return self::remove_ ( $tableName, $where );
106
	}
107
108
	/**
109
	 * Inserts a new instance $instance into the database
110
	 *
111
	 * @param object $instance the instance to insert
112
	 * @param boolean $insertMany if true, save instances related to $instance by a ManyToMany association
113
	 */
114 3
	public static function insert($instance, $insertMany = false) {
115 3
		EventsManager::trigger ( 'dao.before.insert', $instance );
116 3
		$tableName = OrmUtils::getTableName ( get_class ( $instance ) );
117 3
		$keyAndValues = Reflexion::getPropertiesAndValues ( $instance );
118 3
		$keyAndValues = array_merge ( $keyAndValues, OrmUtils::getManyToOneMembersAndValues ( $instance ) );
119 3
		$sql = "INSERT INTO `" . $tableName . "`(" . SqlUtils::getInsertFields ( $keyAndValues ) . ") VALUES(" . SqlUtils::getInsertFieldsValues ( $keyAndValues ) . ")";
120 3
		Logger::info ( "DAOUpdates", $sql, "insert" );
121 3
		Logger::info ( "DAOUpdates", json_encode ( $keyAndValues ), "Key and values" );
122 3
		$statement = self::$db->prepareStatement ( $sql );
123 3
		foreach ( $keyAndValues as $key => $value ) {
124 3
			self::$db->bindValueFromStatement ( $statement, $key, $value );
125
		}
126
		try {
127 3
			$result = $statement->execute ();
128 3
			if ($result) {
129 3
				$pk = OrmUtils::getFirstKey ( get_class ( $instance ) );
130 3
				$accesseurId = "set" . ucfirst ( $pk );
131 3
				$lastId = self::$db->lastInserId ();
132 3
				if ($lastId != 0) {
133 3
					$instance->$accesseurId ( $lastId );
134 3
					$instance->_rest [$pk] = $lastId;
135
				}
136 3
				if ($insertMany) {
137 1
					self::insertOrUpdateAllManyToMany ( $instance );
138
				}
139
			}
140 3
			EventsManager::trigger ( DAOEvents::AFTER_INSERT, $instance, $result );
141 3
			return $result;
142 1
		} catch ( \PDOException $e ) {
143 1
			Logger::warn ( "DAOUpdates", $e->getMessage (), "insert" );
144
		}
145 1
		return false;
146
	}
147
148
	/**
149
	 * Met à jour les membres de $instance annotés par un ManyToMany
150
	 *
151
	 * @param object $instance
152
	 */
153 1
	public static function insertOrUpdateAllManyToMany($instance) {
154 1
		$members = OrmUtils::getAnnotationInfo ( get_class ( $instance ), "#manyToMany" );
155 1
		if ($members !== false) {
156
			$members = \array_keys ( $members );
157
			foreach ( $members as $member ) {
158
				self::insertOrUpdateManyToMany ( $instance, $member );
159
			}
160
		}
161 1
	}
162
163
	/**
164
	 * Updates the $member member of $instance annotated by a ManyToMany
165
	 *
166
	 * @param Object $instance
167
	 * @param String $member
168
	 */
169
	public static function insertOrUpdateManyToMany($instance, $member) {
170
		$parser = new ManyToManyParser ( $instance, $member );
171
		if ($parser->init ()) {
172
			$myField = $parser->getMyFkField ();
173
			$field = $parser->getFkField ();
174
			$sql = "INSERT INTO `" . $parser->getJoinTable () . "`(`" . $myField . "`,`" . $field . "`) VALUES (:" . $myField . ",:" . $field . ");";
175
			$memberAccessor = "get" . ucfirst ( $member );
176
			$memberValues = $instance->$memberAccessor ();
177
			$myKey = $parser->getMyPk ();
178
			$myAccessorId = "get" . ucfirst ( $myKey );
179
			$accessorId = "get" . ucfirst ( $parser->getPk () );
180
			$id = $instance->$myAccessorId ();
181
			if (! is_null ( $memberValues )) {
182
				self::$db->execute ( "DELETE FROM `" . $parser->getJoinTable () . "` WHERE `" . $myField . "`='" . $id . "'" );
183
				$statement = self::$db->prepareStatement ( $sql );
184
				foreach ( $memberValues as $targetInstance ) {
185
					$foreignId = $targetInstance->$accessorId ();
186
					$foreignInstances = self::getAll ( $parser->getTargetEntity (), "`" . $parser->getPk () . "`" . "='" . $foreignId . "'" );
187
					if (! OrmUtils::exists ( $targetInstance, $parser->getPk (), $foreignInstances )) {
188
						self::insert ( $targetInstance, false );
189
						$foreignId = $targetInstance->$accessorId ();
190
						Logger::info ( "DAOUpdates", "Insertion d'une instance de " . get_class ( $instance ), "InsertMany" );
191
					}
192
					self::$db->bindValueFromStatement ( $statement, $myField, $id );
193
					self::$db->bindValueFromStatement ( $statement, $field, $foreignId );
194
					$statement->execute ();
195
					Logger::info ( "DAOUpdates", "Insertion des valeurs dans la table association '" . $parser->getJoinTable () . "'", "InsertMany" );
196
				}
197
			}
198
		}
199
	}
200
201
	/**
202
	 * Updates an existing $instance in the database.
203
	 * Be careful not to modify the primary key
204
	 *
205
	 * @param object $instance instance to modify
206
	 * @param boolean $updateMany Adds or updates ManyToMany members
207
	 */
208 3
	public static function update($instance, $updateMany = false) {
209 3
		EventsManager::trigger ( "dao.before.update", $instance );
210 3
		$tableName = OrmUtils::getTableName ( get_class ( $instance ) );
211 3
		$ColumnskeyAndValues = Reflexion::getPropertiesAndValues ( $instance );
212 3
		$ColumnskeyAndValues = array_merge ( $ColumnskeyAndValues, OrmUtils::getManyToOneMembersAndValues ( $instance ) );
213 3
		$keyFieldsAndValues = OrmUtils::getKeyFieldsAndValues ( $instance );
214 3
		$sql = "UPDATE `" . $tableName . "` SET " . SqlUtils::getUpdateFieldsKeyAndValues ( $ColumnskeyAndValues ) . " WHERE " . SqlUtils::getWhere ( $keyFieldsAndValues );
215 3
		Logger::info ( "DAOUpdates", $sql, "update" );
216 3
		Logger::info ( "DAOUpdates", json_encode ( $ColumnskeyAndValues ), "Key and values" );
217 3
		$statement = self::$db->prepareStatement ( $sql );
218 3
		foreach ( $ColumnskeyAndValues as $key => $value ) {
219 3
			self::$db->bindValueFromStatement ( $statement, $key, $value );
220
		}
221
		try {
222 3
			$result = $statement->execute ();
223 3
			if ($result && $updateMany)
224 1
				self::insertOrUpdateAllManyToMany ( $instance );
225 3
			EventsManager::trigger ( DAOEvents::AFTER_UPDATE, $instance, $result );
226 3
			return $result;
227
		} catch ( \PDOException $e ) {
228
			Logger::warn ( "DAOUpdates", $e->getMessage (), "update" );
229
		}
230
		return false;
231
	}
232
233
	/**
234
	 *
235
	 * @param object $instance
236
	 * @param boolean $updateMany
237
	 * @return boolean|int
238
	 */
239
	public static function save($instance, $updateMany = false) {
240
		if (isset ( $instance->_rest )) {
241
			return self::update ( $instance, $updateMany );
242
		}
243
		return self::insert ( $instance, $updateMany );
244
	}
245
}
246