Ubiquity  2.0.3
php rapid development framework
CRUDHelper.php
Go to the documentation of this file.
1 <?php
2 
4 
12 
13 class CRUDHelper {
14  public static function getIdentifierFunction($model) {
15  $pks = self::getPks ( $model );
16  return function ($index, $instance) use ($pks) {
17  $values = [ ];
18  foreach ( $pks as $pk ) {
19  $getter = "get" . ucfirst ( $pk );
20  if (method_exists ( $instance, $getter )) {
21  $values [] = $instance->{$getter} ();
22  }
23  }
24  return implode ( "_", $values );
25  };
26  }
27 
28  public static function search($model,$search,$fields,$initialCondition="1=1"){
29  $words=preg_split("@(\s*?(\(|\)|\|\||\&\&)\s*?)@", $search);
30  $words=array_filter($words,'strlen');
31  $condition=$search;
32  foreach ($words as $word){
33  $word=trim($word);
34  $condition=UString::replaceFirstOccurrence($word, "(".SqlUtils::getSearchWhere($fields,$word).")", $condition);
35  }
36 
37  $condition=str_replace("||", " OR ", $condition);
38  $condition=str_replace("&&", " AND ", $condition);
39  $condition='('.$condition.') AND ('.$initialCondition.')';
40  return DAO::getAll($model,$condition);
41  }
42 
43  public static function update($instance,$values,$updateManyToOneInForm=true,$updateManyToManyInForm=false) {
44  $update=false;
45  $className=\get_class($instance);
46  $relations=OrmUtils::getManyToOneFields($className);
47  $fieldTypes=OrmUtils::getFieldTypes($className);
48  foreach ( $fieldTypes as $property => $type ) {
49  if ($type == "tinyint(1)") {
50  if (isset($values[$property])) {
51  $values[$property]=1;
52  } else {
53  $values[$property]=0;
54  }
55  }
56  }
57  URequest::setValuesToObject($instance, $values);
58  foreach ( $relations as $member ) {
59  if ($updateManyToOneInForm) {
60  $joinColumn=OrmUtils::getAnnotationInfoMember($className, "#joinColumn", $member);
61  if ($joinColumn) {
62  $fkClass=$joinColumn["className"];
63  $fkField=$joinColumn["name"];
64  if (isset($values[$fkField])) {
65  $fkObject=DAO::getOne($fkClass, $values["$fkField"]);
66  Reflexion::setMemberValue($instance, $member, $fkObject);
67  }
68  }
69  }
70  }
71  if (isset($instance)) {
72  if ($instance->_new) {
73  $update=DAO::insert($instance);
74  } else {
75  $update=DAO::update($instance);
76  if (DbCache::$active) {
77  // TODO update dbCache
78  }
79  }
80  if ($update) {
81  if ($updateManyToManyInForm) {
82  $relations=OrmUtils::getManyToManyFields($className);
83  foreach ( $relations as $member ) {
84  if (($annot=OrmUtils::getAnnotationInfoMember($className, "#manyToMany", $member)) !== false) {
85  $newField=$member . "Ids";
86  $fkClass=$annot["targetEntity"];
87  $fkObjects=DAO::getAll($fkClass, self::getMultiWhere($values[$newField], $className));
88  if (Reflexion::setMemberValue($instance, $member, $fkObjects)) {
89  DAO::insertOrUpdateManyToMany($instance, $member);
90  }
91  }
92  }
93  }
94  }
95  }
96  return $update;
97  }
98 
99  private static function getPks($model) {
100  $instance=new $model();
101  return OrmUtils::getKeyFields($instance);
102  }
103 
104  private static function getMultiWhere($ids, $class) {
105  $pk=OrmUtils::getFirstKey($class);
106  $ids=explode(",", $ids);
107  if (sizeof($ids) < 1)
108  return "";
109  $strs=[ ];
110  $idCount=\sizeof($ids);
111  for($i=0; $i < $idCount; $i++) {
112  $strs[]=$pk . "='" . $ids[$i] . "'";
113  }
114  return implode(" OR ", $strs);
115  }
116 
117  public static function getFkIntance($instance,$model,$member){
118  $result=[];
119  if (($annot=OrmUtils::getAnnotationInfoMember($model, "#oneToMany", $member)) !== false) {
120  $objectFK=DAO::getOneToMany($instance, $member);
121  $fkClass=$annot["className"];
122  } elseif (($annot=OrmUtils::getAnnotationInfoMember($model, "#manyToMany", $member)) !== false) {
123  $objectFK=DAO::getManyToMany($instance, $member);
124  $fkClass=$annot["targetEntity"];
125  } else {
126  $objectFK=Reflexion::getMemberValue($instance, $member);
127  if (isset($objectFK))
128  $fkClass=\get_class($objectFK);
129  }
130  if(isset($fkClass)){
131  $fkTable=OrmUtils::getTableName($fkClass);
132  $result[$member]=compact("objectFK","fkClass","fkTable");
133  }
134  return $result;
135  }
136 
137  public static function getFKIntances($instance,$model){
138  $result=[];
139  $relations=OrmUtils::getFieldsInRelations($model);
140  foreach ( $relations as $member ) {
141  $fkInstance=self::getFkIntance($instance, $model, $member);
142  if(sizeof($fkInstance)>0){
143  $result=array_merge($result,$fkInstance);
144  }
145  }
146  return $result;
147  }
148 }
149 
static getFieldsInRelations($class)
Definition: OrmUtils.php:223
static getSearchWhere($fields, $value, $jokerBefore="%", $jokerAfter="%")
Definition: SqlUtils.php:49
static getOne($className, $keyValues, $loadManyToOne=true, $loadOneToMany=false, $useCache=NULL)
Returns an instance of $className from the database, from $keyvalues values of the primary key...
Definition: DAO.php:363
static getAnnotationInfoMember($class, $keyAnnotation, $member)
Definition: OrmUtils.php:201
static setValuesToObject($object, $values=null)
Affects member to member the values of the associative array $values to the members of the object $ob...
Definition: URequest.php:21
static setMemberValue($instance, $member, $value)
Definition: Reflexion.php:40
static insertOrUpdateManyToMany($instance, $member)
Updates the $member member of $instance annotated by a ManyToMany.
static getFirstKey($class)
Definition: OrmUtils.php:122
static getManyToMany($instance, $member, $array=null, $useCache=NULL)
Assigns / loads the child records in the $member member of $instance.
Definition: DAO.php:127
static getMultiWhere($ids, $class)
Definition: CRUDHelper.php:104
static getAll($className, $condition='', $loadManyToOne=true, $loadOneToMany=false, $useCache=NULL)
Returns an array of $className objects from the database.
Definition: DAO.php:193
static getFkIntance($instance, $model, $member)
Definition: CRUDHelper.php:117
static getMemberValue($instance, $member)
Definition: Reflexion.php:34
static getFieldTypes($className)
Definition: OrmUtils.php:86
static getManyToManyFields($class)
Definition: OrmUtils.php:241
static getFKIntances($instance, $model)
Definition: CRUDHelper.php:137
static getTableName($class)
Definition: OrmUtils.php:62
static getOneToMany($instance, $member, $useCache=NULL, $annot=null)
Assign / load the child records in the $member member of $instance.
Definition: DAO.php:71
static getManyToOneFields($class)
Definition: OrmUtils.php:237
static search($model, $search, $fields, $initialCondition="1=1")
Definition: CRUDHelper.php:28
static getKeyFields($instance)
Definition: OrmUtils.php:72
static replaceFirstOccurrence($pattern, $replacement, $subject)
Definition: UString.php:80
static update($instance, $values, $updateManyToOneInForm=true, $updateManyToManyInForm=false)
Definition: CRUDHelper.php:43
static update($instance, $updateMany=false)
Updates an existing $instance in the database.
static insert($instance, $insertMany=false)
Inserts a new instance $ instance into the database.