Passed
Push — master ( ed52d3...a8880a )
by Jean-Christophe
05:41
created

DAOUpdatesTrait::removeByKey_()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 4.0092

Importance

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