public function init() { $member = $this->member; $instance = $this->instance; $class = get_class($instance); $annot = Reflexion::getAnnotationMember($class, $member, "ManyToMany"); if ($annot != false) { $this->targetEntity = $annot->targetEntity; $this->inversedBy = strtolower($this->targetEntity) . "s"; if (!is_null($annot->inversedBy)) { $this->inversedBy = $annot->inversedBy; } $this->targetEntityClass = get_class(new $this->targetEntity()); $pk = OrmUtils::getFirstKey($this->targetEntityClass); $annotJoinTable = Reflexion::getAnnotationMember($class, $member, "JoinTable"); $this->joinTable = $annotJoinTable->name; $joinColumnsAnnot = $annotJoinTable->joinColumns; $this->myFkField = "id" . OrmUtils::getTableName($class); $this->myPk = OrmUtils::getFirstKey($class); if (!is_null($joinColumnsAnnot)) { $this->myFkField = $joinColumnsAnnot->name; $this->myPk = $joinColumnsAnnot->referencedColumnName; } $this->targetEntityTable = OrmUtils::getTableName($this->targetEntity); $this->fkField = "id" . ucfirst($this->targetEntityTable); $this->pk = OrmUtils::getFirstKey($this->targetEntityClass); $inverseJoinColumnsAnnot = $annotJoinTable->inverseJoinColumns; if (!is_null($inverseJoinColumnsAnnot)) { $this->fkField = $inverseJoinColumnsAnnot->name; $this->pk = $inverseJoinColumnsAnnot->referencedColumnName; } return true; } return false; }
/** * Affecte/charge les enregistrements fils dans le membre $member de $instance. * Si $array est null, les fils sont chargés depuis la base de données * @param Classe $instance * @param string $member Membre sur lequel doit être présent une annotation OneToMany * @param array $array paramètre facultatif contenant la liste des fils possibles */ public static function getOneToMany($instance, $member, $array = null) { $ret = array(); $class = get_class($instance); $annot = Reflexion::getAnnotationMember($class, $member, "OneToMany"); if ($annot != false) { $fk = Reflexion::getAnnotationMember($annot->className, $annot->mappedBy, "JoinColumn"); $fkv = OrmUtils::getFirstKeyValue($instance); if (is_null($array)) { $ret = DAO::getAll($annot->className, $fk->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; } } } } $accessor = "set" . ucfirst($member); if (method_exists($instance, $accessor)) { \Logger::log("getOneToMany", "Chargement de " . $member . " pour l'objet " . $class); $instance->{$accessor}($ret); } else { \Logger::warn("getOneToMany", "L'accesseur " . $accessor . " est manquant pour " . $class); } } return $ret; }