Passed
Push — master ( 36e11f...247cd1 )
by Jean-Christophe
01:24
created

DAOCoreTrait::setToMember()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
nc 2
nop 5
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Ubiquity\orm\traits;
4
5
use Ubiquity\orm\OrmUtils;
6
use Ubiquity\log\Logger;
7
use Ubiquity\events\EventsManager;
8
use Ubiquity\orm\parser\ConditionParser;
9
use Ubiquity\db\SqlUtils;
10
11
/**
12
 * @author jc
13
 * @property \Ubiquity\db\Database $db
14
 *
15
 */
16
trait DAOCoreTrait {
17
	abstract protected static function _affectsRelationObjects($manyToOneQueries,$oneToManyQueries,$manyToManyParsers,$objects,$included,$useCache);
18
	abstract protected static function prepareManyToMany(&$ret,$instance, $member, $annot=null);
19
	abstract protected static function prepareManyToOne(&$ret, $instance,$value, $fkField,$annotationArray);
20
	abstract protected static function prepareOneToMany(&$ret,$instance, $member, $annot=null);
21
	abstract protected static function _initRelationFields($included,$metaDatas,&$invertedJoinColumns,&$oneToManyFields,&$manyToManyFields);
22
	abstract protected static function getIncludedForStep($included);
23
	
24
	private static function _getOneToManyFromArray(&$ret, $array, $fkv, $mappedBy) {
25
		$elementAccessor="get" . ucfirst($mappedBy);
26
		foreach ( $array as $element ) {
27
			$elementRef=$element->$elementAccessor();
28
			if (!is_null($elementRef)) {
29
				if(is_object($elementRef))
30
					$idElementRef=OrmUtils::getFirstKeyValue($elementRef);
31
					else
32
						$idElementRef=$elementRef;
33
						if ($idElementRef == $fkv)
34
							$ret[]=$element;
35
			}
36
		}
37
	}
38
	
39
	private static function getManyToManyFromArray($instance, $array, $class, $parser) {
40
		$ret=[];
41
		$continue=true;
42
		$accessorToMember="get" . ucfirst($parser->getInversedBy());
43
		$myPkAccessor="get" . ucfirst($parser->getMyPk());
44
		
45
		if (!method_exists($instance, $myPkAccessor)) {
46
			Logger::warn("DAO", "L'accesseur au membre clé primaire " . $myPkAccessor . " est manquant pour " . $class,"ManyToMany");
47
		}
48
		if (sizeof($array) > 0){
49
			$continue=method_exists(current($array), $accessorToMember);
50
		}
51
		if ($continue) {
52
			foreach ( $array as $targetEntityInstance ) {
53
				$instances=$targetEntityInstance->$accessorToMember();
54
				if (is_array($instances)) {
55
					foreach ( $instances as $inst ) {
56
						if ($inst->$myPkAccessor() == $instance->$myPkAccessor())
57
							array_push($ret, $targetEntityInstance);
58
					}
59
				}
60
			}
61
		} else {
62
			Logger::warn("DAO", "L'accesseur au membre " . $parser->getInversedBy() . " est manquant pour " . $parser->getTargetEntity(),"ManyToMany");
63
		}
64
		return $ret;
65
	}
66
	
67
	protected static function _getOne($className,ConditionParser $conditionParser,$included,$useCache){
68
		$conditionParser->limitOne();
69
		$retour=self::_getAll($className, $conditionParser, $included,$useCache);
70
		if (sizeof($retour) < 1){
71
			return null;
72
		}
73
		$result= \current($retour);
74
		EventsManager::trigger("dao.getone", $result,$className);
75
		return $result;
76
	}
77
	
78
	
79
	/**
80
	 * @param string $className
81
	 * @param ConditionParser $conditionParser
82
	 * @param boolean|array $included
83
	 * @param boolean|null $useCache
84
	 * @return array
85
	 */
86
	protected static function _getAll($className, ConditionParser $conditionParser, $included=true,$useCache=NULL) {
87
		$included=self::getIncludedForStep($included);
88
		$objects=array ();
89
		$invertedJoinColumns=null;
90
		$oneToManyFields=null;
91
		$manyToManyFields=null;
92
		
93
		$metaDatas=OrmUtils::getModelMetadata($className);
94
		$tableName=$metaDatas["#tableName"];
95
		$hasIncluded=$included || (is_array($included) && sizeof($included)>0);
96
		if($hasIncluded){
97
			self::_initRelationFields($included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields);
98
		}
99
		$condition=SqlUtils::checkWhere($conditionParser->getCondition());
100
		$members=\array_diff($metaDatas["#fieldNames"],$metaDatas["#notSerializable"]);
101
		$query=self::$db->prepareAndExecute($tableName, $condition,$members,$conditionParser->getParams(),$useCache);
102
		$oneToManyQueries=[];
103
		$manyToOneQueries=[];
104
		$manyToManyParsers=[];
105
		
106
		foreach ( $query as $row ) {
107
			$object=self::loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields,$manyToManyFields,$members, $oneToManyQueries,$manyToOneQueries,$manyToManyParsers);
108
			$key=OrmUtils::getKeyValues($object);
109
			$objects[$key]=$object;
110
		}
111
		if($hasIncluded){
112
			self::_affectsRelationObjects($manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache);
113
		}
114
		EventsManager::trigger("dao.getall", $objects,$className);
115
		return $objects;
116
	}
117
	
118
	
119
	/**
120
	 * @param array $row
121
	 * @param string $className
122
	 * @param array $invertedJoinColumns
123
	 * @param array $oneToManyFields
124
	 * @param array $members
125
	 * @param array $oneToManyQueries
126
	 * @param array $manyToOneQueries
127
	 * @param array $manyToManyParsers
128
	 * @return object
129
	 */
130
	private static function loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields, $manyToManyFields,$members,&$oneToManyQueries,&$manyToOneQueries,&$manyToManyParsers) {
131
		$o=new $className();
132
		foreach ( $row as $k => $v ) {
133
			if(sizeof($fields=\array_keys($members,$k))>0){
134
				foreach ($fields as $field){
135
					$accesseur="set" . ucfirst($field);
136
					if (method_exists($o, $accesseur)) {
137
						$o->$accesseur($v);
138
					}
139
				}
140
			}
141
			$o->_rest[$k]=$v;
142
			if (isset($invertedJoinColumns) && isset($invertedJoinColumns[$k])) {
143
				$fk="_".$k;
144
				$o->$fk=$v;
145
				self::prepareManyToOne($manyToOneQueries,$o,$v, $fk,$invertedJoinColumns[$k]);
146
			}
147
		}
148
		if (isset($oneToManyFields)) {
149
			foreach ( $oneToManyFields as $k => $annot ) {
150
				self::prepareOneToMany($oneToManyQueries,$o, $k, $annot);
151
			}
152
		}
153
		if (isset($manyToManyFields)) {
154
			foreach ( $manyToManyFields as $k => $annot ) {
155
				self::prepareManyToMany($manyToManyParsers,$o, $k, $annot);
156
			}
157
		}
158
		return $o;
159
	}
160
	
161
	private static function parseKey(&$keyValues,$className){
162
		if (!is_array($keyValues)) {
163
			if (strrpos($keyValues, "=") === false && strrpos($keyValues, ">") === false && strrpos($keyValues, "<") === false) {
164
				$keyValues="`" . OrmUtils::getFirstKey($className) . "`='" . $keyValues . "'";
165
			}
166
		}
167
	}
168
}
169
170