Skip to content

Commit

Permalink
DAO complexity reduction
Browse files Browse the repository at this point in the history
  • Loading branch information
jcheron committed Apr 12, 2017
1 parent fea01a1 commit a0516af
Showing 1 changed file with 62 additions and 51 deletions.
113 changes: 62 additions & 51 deletions micro/orm/DAO.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,22 +101,26 @@ public static function getOneToMany($instance,$member,$array=null,$annot=null){
if(is_null($array)){
$ret=self::getAll($annot["className"],$fkAnnot["name"]."='".$fkv."'");
}else{
$elementAccessor="get".ucfirst($annot->mappedBy);
foreach ($array as $element){
$elementRef=$element->$elementAccessor();
if(!is_null($elementRef)){
$idElementRef=OrmUtils::getFirstKeyValue($elementRef);
if($idElementRef==$fkv)
$ret[]=$element;
}
}
self::getOneToManyFromArray($ret, $array, $fkv, $annot);
}
self::setToMember($member, $instance, $ret, $class, "getOneToMany");
}
}
return $ret;
}

private static function getOneToManyFromArray(&$ret,$array,$fkv,$annot){
$elementAccessor="get".ucfirst($annot["mappedBy"]);
foreach ($array as $element){
$elementRef=$element->$elementAccessor();
if(!is_null($elementRef)){
$idElementRef=OrmUtils::getFirstKeyValue($elementRef);
if($idElementRef==$fkv)
$ret[]=$element;
}
}
}

private static function setToMember($member,$instance,$value,$class,$part){
$accessor="set".ucfirst($member);
if(method_exists($instance,$accessor)){
Expand Down Expand Up @@ -149,43 +153,45 @@ public static function getManyToMany($instance,$member,$array=null){
$class=get_class($instance);
$parser=new ManyToManyParser($instance, $member);
if($parser->init()){
$joinTableCursor=self::getSQLForJoinTable($instance,$parser);
if(is_null($array)){
$joinTableCursor=self::getSQLForJoinTable($instance,$parser);
foreach($joinTableCursor as $row){
$fkv=$row[$parser->getFkField()];
$tmp=self::getOne($parser->getTargetEntity(),"`".$parser->getPk()."`='".$fkv."'");
array_push($ret,$tmp);
}
}
else{
$continue=true;
$accessorToMember="get".ucfirst($parser->getInversedBy());
$myPkAccessor="get".ucfirst($parser->getMyPk());
self::getManyToManyFromArray($ret, $instance, $array, $class, $parser);
}
self::setToMember($member, $instance, $ret, $class, "getManyToMany");
}
return $ret;
}

if(!method_exists($instance, $myPkAccessor)){
Logger::warn("ManyToMany", "L'accesseur au membre clé primaire ".$myPkAccessor." est manquant pour ".$class);
}
if(count($array)>0)
$continue=method_exists($array[0], $accessorToMember);
if($continue){
foreach($joinTableCursor as $row){
foreach($array as $targetEntityInstance){
$instances=$targetEntityInstance->$accessorToMember();
if(is_array($instances)){
foreach ($instances as $inst){
if($inst->$myPkAccessor==$instance->$myPkAccessor)
array_push($array, $targetEntityInstance);
}
}
private static function getManyToManyFromArray(&$ret,$instance,$array,$class,$parser){
$continue=true;
$accessorToMember="get".ucfirst($parser->getInversedBy());
$myPkAccessor="get".ucfirst($parser->getMyPk());

if(!method_exists($instance, $myPkAccessor)){
Logger::warn("ManyToMany", "L'accesseur au membre clé primaire ".$myPkAccessor." est manquant pour ".$class);
}
if(count($array)>0)
$continue=method_exists($array[0], $accessorToMember);
if($continue){
foreach($array as $targetEntityInstance){
$instances=$targetEntityInstance->$accessorToMember();
if(is_array($instances)){
foreach ($instances as $inst){
if($inst->$myPkAccessor()==$instance->$myPkAccessor())
array_push($ret, $targetEntityInstance);
}
}
}else{
Logger::warn("ManyToMany", "L'accesseur au membre ".$parser->getInversedBy()." est manquant pour ".$parser->getTargetEntity());
}
}else{
Logger::warn("ManyToMany", "L'accesseur au membre ".$parser->getInversedBy()." est manquant pour ".$parser->getTargetEntity());
}
self::setToMember($member, $instance, $ret, $class, "getManyToMany");
}
return $ret;
}
/**
* Retourne un tableau d'objets de $className depuis la base de données
Expand All @@ -207,26 +213,31 @@ public static function getAll($className,$condition='',$loadManyToOne=true,$load
$query=self::$db->prepareAndExecute("SELECT * FROM ".$tableName.$condition);
Logger::log("getAll","SELECT * FROM ".$tableName.$condition);
foreach ($query as $row){
$o=new $className();
$o=self::loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields);
$objects[]=$o;
foreach ($row as $k=>$v){
$accesseur="set".ucfirst($k);
if(method_exists($o,$accesseur)){
$o->$accesseur($v);
}
if(isset($invertedJoinColumns) && isset($invertedJoinColumns[$k])) {
self::getOneManyToOne($o,$v, $invertedJoinColumns[$k]);
}
}
if(isset($oneToManyFields)){
foreach ($oneToManyFields as $k=>$annot){
self::getOneToMany($o, $k,null,$annot);
}
}
self::addInstanceInObjects($o);
}
return $objects;
}

private static function loadObjectFromRow($row,$className,$invertedJoinColumns,$oneToManyFields){
$o=new $className();
foreach ($row as $k=>$v){
$accesseur="set".ucfirst($k);
if(method_exists($o,$accesseur)){
$o->$accesseur($v);
}
if(isset($invertedJoinColumns) && isset($invertedJoinColumns[$k])) {
self::getOneManyToOne($o,$v, $invertedJoinColumns[$k]);
}
}
if(isset($oneToManyFields)){
foreach ($oneToManyFields as $k=>$annot){
self::getOneToMany($o, $k,null,$annot);
}
}
return $o;
}
/**
* Retourne le nombre d'objets de $className depuis la base de données respectant la condition éventuellement passée en paramètre
* @param string $className nom de la classe du model à charger
Expand All @@ -244,7 +255,7 @@ public static function count($className,$condition=''){
* @param String $className nom de la classe du model à charger
* @param Array|string $keyValues valeurs des clés primaires ou condition
*/
public static function getOne($className,$keyValues,$loadManyToOne=true){
public static function getOne($className,$keyValues,$loadManyToOne=true,$loadOneToMany=false){
if(!is_array($keyValues)){
if(strrpos($keyValues,"=")===false){
$keyValues="`".OrmUtils::getFirstKey($className)."`='".$keyValues."'";
Expand All @@ -254,7 +265,7 @@ public static function getOne($className,$keyValues,$loadManyToOne=true){
$condition=self::getCondition($keyValues);
$retour=self::getInstanceInObjects($className,$condition);
if(!isset($retour)){
$retour=self::getAll($className,$condition,$loadManyToOne);
$retour=self::getAll($className,$condition,$loadManyToOne,$loadOneToMany);
if(sizeof($retour)<1)
return null;
else
Expand Down Expand Up @@ -341,7 +352,7 @@ public static function insertOrUpdateManyToMany($instance,$member){
if(!is_null($memberValues)){
self::$db->execute("DELETE FROM `".$parser->getJoinTable()."` WHERE `".$myField."`='".$id."'");
$statement=self::$db->prepareStatement($sql);
foreach ($memberValues as $k=>$targetInstance){
foreach ($memberValues as $targetInstance){
$foreignId=$targetInstance->$accessorId();
$foreignInstances=self::getAll($parser->getTargetEntity(), "`".$parser->getPk()."`"."='".$foreignId."'");
if(!OrmUtils::exists($targetInstance, $parser->getPk(), $foreignInstances)){
Expand Down

0 comments on commit a0516af

Please sign in to comment.