Passed
Push — master ( 4162a6...5bc725 )
by Jean-Christophe
05:05
created

OrmUtilsRelationsTrait::getJoinTables()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 2
nop 1
dl 0
loc 10
ccs 0
cts 7
cp 0
crap 12
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Ubiquity\orm\traits;
4
5
use Ubiquity\orm\parser\ManyToManyParser;
6
7
trait OrmUtilsRelationsTrait {
8
	
9
	abstract public static function getAnnotationInfoMember($class, $keyAnnotation, $member);
10
	abstract public static function getAnnotationInfo($class, $keyAnnotation);
11
	abstract public static function getTableName($class);
12
	abstract public static function getFirstKey($class);
13
	abstract public static function getModelMetadata($className);
14
	abstract public static function getKeyFieldsAndValues($instance);
15
	
16
	public static function getJoinTables($class){
17
		$result=[];
18
		
19
		if(isset(self::getModelMetadata($class)["#joinTable"])){
20
			$jts=self::getModelMetadata($class)["#joinTable"];
21
			foreach ($jts as $jt){
22
				$result[]=$jt["name"];
23
			}
24
		}
25
		return $result;
26
	}
27
	
28
	public static function getAllJoinTables($models){
29
		$result=[];
30
		foreach ($models as $model){
31
			$result=array_merge($result,self::getJoinTables($model));
32
		}
33
		return $result;
34
	}
35
	
36 2
	public static function getFieldsInRelations($class) {
37 2
		$result=[ ];
38
		
39 2
		if ($manyToOne=self::getAnnotationInfo($class, "#manyToOne")) {
40
			$result=\array_merge($result, $manyToOne);
41
		}
42 2
		if ($oneToMany=self::getAnnotationInfo($class, "#oneToMany")) {
43 2
			$result=\array_merge($result, \array_keys($oneToMany));
44
		}
45 2
		if ($manyToMany=self::getAnnotationInfo($class, "#manyToMany")) {
46
			$result=\array_merge($result, \array_keys($manyToMany));
47
		}
48 2
		return $result;
49
	}
50
	
51 4
	public static function getFieldsInRelations_($class) {
52 4
		return self::getFieldsInRelationsForUpdate_($class)["relations"];
53
	}
54
	
55 4
	public static function getFieldsInRelationsForUpdate_($class) {
56 4
		$result=[ ];
57 4
		if ($manyToOne=self::getAnnotationInfo($class, "#manyToOne")) {
58 1
			foreach ($manyToOne as $member){
59 1
				$joinColumn = self::getAnnotationInfoMember ( $class, "#joinColumn", $member );
60 1
				$result[$joinColumn["name"]]=$member;
61
			}
62
		}
63 4
		if ($manyToMany=self::getAnnotationInfo($class, "#manyToMany")) {
64
			$manyToMany=array_keys($manyToMany);
65
			foreach ($manyToMany as $member){
66
				$result[$member . "Ids"]=$member;
67
			}
68
		}
69 4
		if ($oneToMany=self::getAnnotationInfo($class, "#oneToMany")) {
70 3
			$oneToMany=array_keys($oneToMany);
71 3
			foreach ($oneToMany as $member){
72 3
				$result[$member . "Ids"]=$member;
73
			}
74
		}
75 4
		return ["relations"=>$result,"manyToOne"=>$manyToOne,"manyToMany"=>$manyToMany,"oneToMany"=>$oneToMany];
76
	}
77
	
78 1
	public static function getAnnotFieldsInRelations($class) {
79 1
		$result=[ ];
80 1
		if ($manyToOnes=self::getAnnotationInfo($class, "#manyToOne")) {
81 1
			$joinColumns=self::getAnnotationInfo($class, "#joinColumn");
82 1
			foreach ($manyToOnes as $manyToOne ){
83 1
				if(isset($joinColumns[$manyToOne])){
84 1
					$result[$manyToOne]=["type"=>"manyToOne","value"=>$joinColumns[$manyToOne]];
85
				}
86
			}
87
		}
88 1
		if ($oneToManys=self::getAnnotationInfo($class, "#oneToMany")) {
89 1
			foreach ($oneToManys as $field=>$oneToMany){
90 1
				$result[$field]=["type"=>"oneToMany","value"=>$oneToMany];
91
			}
92
		}
93 1
		if ($manyToManys=self::getAnnotationInfo($class, "#manyToMany")) {
94 1
			foreach ($manyToManys as $field=>$manyToMany){
95 1
				$result[$field]=["type"=>"manyToMany","value"=>$manyToMany];
96
			}
97
		}
98 1
		return $result;
99
	}
100
	
101 1
	public static function getUJoinSQL($model,$arrayAnnot,$field,&$aliases){
102 1
		$type=$arrayAnnot["type"];$annot=$arrayAnnot["value"];
103 1
		$table=self::getTableName($model);
104 1
		$tableAlias=(isset($aliases[$table]))?$aliases[$table]:$table;
105 1
		if($type==="manyToOne"){
106
			$fkClass=$annot["className"];
107
			$fkTable=self::getTableName($fkClass);
108
			$fkField=$annot["name"];
109
			$pkField=self::getFirstKey($fkClass);
110
			$alias=self::getJoinAlias($table, $fkTable);
111
			$result="INNER JOIN `{$fkTable}` `{$alias}` ON `{$tableAlias}`.`{$fkField}`=`{$alias}`.`{$pkField}`";
112 1
		}elseif($type==="oneToMany"){
113
			$fkClass=$annot["className"];
114
			$fkAnnot=self::getAnnotationInfoMember($fkClass, "#joinColumn", $annot["mappedBy"]);
115
			$fkTable=self::getTableName($fkClass);
116
			$fkField=$fkAnnot["name"];
117
			$pkField=self::getFirstKey($model);
118
			$alias=self::getJoinAlias($table, $fkTable);
119
			$result="INNER JOIN `{$fkTable}` `{$alias}` ON `{$tableAlias}`.`{$pkField}`=`{$alias}`.`{$fkField}`";
120
		}else{
121 1
			$parser=new ManyToManyParser($model,$field);
122 1
			$parser->init($annot);
123 1
			$fkTable=$parser->getTargetEntityTable();
124 1
			$fkClass=$parser->getTargetEntityClass();
125 1
			$alias=self::getJoinAlias($table, $fkTable);
126 1
			$result=$parser->getSQL($alias,$aliases);
127
		}
128
		
129 1
		if(array_search($alias, $aliases)!==false){
130
			$result="";
131
		}
132 1
		$aliases[$fkTable]=$alias;
133 1
		return ["class"=>$fkClass,"table"=>$fkTable,"sql"=>$result,"alias"=>$alias];
134
	}
135
	
136 1
	private static function getJoinAlias($table,$fkTable){
137 1
		return uniqid($fkTable.'_'.$table[0]);
138
	}
139
	
140
	public static function getOneToManyFields($class) {
141
		return self::getAnnotationInfo($class, "#oneToMany");
142
	}
143
	
144
	public static function getManyToOneFields($class) {
145
		return self::getAnnotationInfo($class, "#manyToOne");
146
	}
147
	
148
	public static function getManyToManyFields($class) {
149
		$result=self::getAnnotationInfo($class, "#manyToMany");
150
		if($result!==false)
151
			return \array_keys($result);
152
			return [];
153
	}
154
	
155 7
	public static function getDefaultFk($classname) {
156 7
		return "id" . \ucfirst(self::getTableName($classname));
157
	}
158
	
159 2
	public static function getMemberJoinColumns($instance,$member,$metaDatas=NULL){
160 2
		if(!isset($metaDatas)){
161 1
			$class=get_class($instance);
162 1
			$metaDatas=self::getModelMetadata($class);
163
		}
164 2
		$invertedJoinColumns=$metaDatas["#invertedJoinColumn"];
165 2
		foreach ($invertedJoinColumns as $field=>$invertedJoinColumn){
166 2
			if($invertedJoinColumn["member"]===$member){
167 2
				return [$field,$invertedJoinColumn];
168
			}
169
		}
170
		return null;
171
	}
172
	
173
	/**
174
	 *
175
	 * @param object $instance
176
	 * @return mixed[]
177
	 */
178 3
	public static function getManyToOneMembersAndValues($instance) {
179 3
		$ret=array ();
180 3
		$class=get_class($instance);
181 3
		$members=self::getAnnotationInfo($class, "#manyToOne");
182 3
		if ($members !== false) {
183 3
			foreach ( $members as $member ) {
184
				$memberAccessor="get" . ucfirst($member);
185
				if (method_exists($instance, $memberAccessor)) {
186
					$memberInstance=$instance->$memberAccessor();
187
					if (isset($memberInstance) && is_object($memberInstance)) {
188
						$keyValues=self::getKeyFieldsAndValues($memberInstance);
189
						if (sizeof($keyValues) > 0) {
190
							$fkName=self::getJoinColumnName($class, $member);
191
							$ret[$fkName]=current($keyValues);
192
						}
193
					}
194
				}
195
			}
196
		}
197 3
		return $ret;
198
	}
199
	
200
	public static function getJoinColumnName($class, $member) {
201
		$annot=self::getAnnotationInfoMember($class, "#joinColumn", $member);
202
		if ($annot !== false) {
203
			$fkName=$annot["name"];
204
		} else {
205
			$fkName="id" . ucfirst(self::getTableName(ucfirst($member)));
206
		}
207
		return $fkName;
208
	}
209
}
210
211