Completed
Push — master ( 361012...7b4150 )
by Jean-Christophe
02:01
created

OrmUtils::getManyToOneMembersAndValues()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 19
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 19
rs 8.8571
c 0
b 0
f 0
cc 5
eloc 14
nc 5
nop 1
1
<?php
2
namespace micro\orm;
3
4
/**
5
 * Utilitaires de mappage Objet/relationnel
6
 * @author jc
7
 * @version 1.0.0.3
8
 * @package orm
9
 */
10
class OrmUtils{
11
	public static function isSerializable($class,$member){
12
		if (Reflexion::getAnnotationMember($class,$member,"@transient")!==false || Reflexion::getAnnotationMember($class,$member,"@manyToOne")!==false ||
13
				Reflexion::getAnnotationMember($class,$member,"@manyToMany")!==false || Reflexion::getAnnotationMember($class,$member,"@oneToMany")!==false)
14
			return false;
15
		else
16
			return true;
17
	}
18
19
	public static function isNullable($class,$member){
20
		$ret=Reflexion::getAnnotationMember($class,$member,"@column");
21
		if (!$ret)
22
			return false;
23
		else
24
			return $ret->nullable;
25
	}
26
27
	public static function getFieldName($class,$member){
28
		$ret=Reflexion::getAnnotationMember($class, $member, "@column");
29
		if($ret===false)
30
			$ret=$member;
31
		else
32
			$ret=$ret->name;
33
		return $ret;
34
	}
35
36
	public static function getTableName($class){
37
		$ret=Reflexion::getAnnotationClass($class, "@table");
38
		if(\sizeof($ret)==0)
39
			$ret=$class;
40
		else{
41
			$ret=$ret[0]->name;
42
		}
43
		return $ret;
44
	}
45
46
	public static function getKeyFieldsAndValues($instance){
47
		$kf=Reflexion::getMembersWithAnnotation(get_class($instance), "@id");
48
		return Reflexion::getPropertiesAndValues($instance,$kf);
49
	}
50
51
	public static function getKeyFields($instance){
52
		return Reflexion::getMembersNameWithAnnotation(get_class($instance), "@id");
53
	}
54
55
	public static function getFieldsInRelations($instance){
56
		$result=Reflexion::getMembersWithAnnotation($instance, "@manyToOne");
57
		$result=\array_merge($result,Reflexion::getMembersWithAnnotation($instance, "@manyToMany"));
58
		$result=\array_merge($result,Reflexion::getMembersWithAnnotation($instance, "@oneToMany"));
59
		return $result;
60
	}
61
62
	public static function getSerializableFields($instance){
63
		$result=[];
64
		$properties=Reflexion::getProperties($instance);
65
		foreach ($properties as $property){
66
			if(self::isSerializable($instance, $property->getName())){
67
				$result[]=$property;
68
			}
69
		}
70
		return $result;
71
	}
72
73
	public static function getFirstKey($class){
74
		$kf=Reflexion::getMembersWithAnnotation($class, "@id");
75
		if(sizeof($kf)>0)
76
			return $kf[0]->getName();
77
	}
78
79
	public static function getFirstKeyValue($instance){
80
		$fkv=self::getKeyFieldsAndValues($instance);
81
		return reset($fkv);
82
	}
83
84
	/**
85
	 * @param object $instance
86
	 * @return mixed[]
87
	 */
88
	public static function getManyToOneMembersAndValues($instance){
89
		$ret=array();
90
		$class=get_class($instance);
91
		$members=Reflexion::getMembersWithAnnotation($class, "@manyToOne");
92
		foreach ($members as $member){
93
			$memberAccessor="get".ucfirst($member->getName());
94
			if(method_exists($instance,$memberAccessor)){
95
				$memberInstance=$instance->$memberAccessor();
96
				if(isset($memberInstance)){
97
					$keyValues=self::getKeyFieldsAndValues($memberInstance);
98
					if(sizeof($keyValues)>0){
99
						$fkName=self::getJoinColumnName($class, $member->getName());
100
						$ret[$fkName]=reset($keyValues);
101
					}
102
				}
103
			}
104
		}
105
		return $ret;
106
	}
107
108
109
110
	/**
111
	 * @param object $instance
112
	 * @param string $memberKey
113
	 * @param array $array
114
	 * @return boolean
115
	 */
116
	public static function exists($instance,$memberKey,$array){
117
		$accessor="get".ucfirst($memberKey);
118
		if(method_exists($instance, $accessor)){
119
			if($array!==null){
120
				foreach ($array as $value){
121
					if($value->$accessor()==$instance->$accessor())
122
						return true;
123
				}
124
			}
125
		}
126
		return false;
127
	}
128
129
	public static function getJoinColumnName($class,$member){
130
		$annot=Reflexion::getAnnotationMember($class, $member, "@joinColumn");
131
		if($annot!==false){
132
			$fkName=$annot->name;
133
		}else{
134
			$fkName="id".ucfirst(self::getTableName(ucfirst($member)));
135
		}
136
		return $fkName;
137
	}
138
139
	public static function isMemberInManyToOne($class,$array,$member){
140
		foreach ($array as $memberMTO){
141
			$annot=Reflexion::getAnnotationMember($class, $memberMTO->getName(), "@joinColumn");
142
			if($annot!==false && $annot->name==$member)
143
				return true;
144
		}
145
		return false;
146
	}
147
}
148