/** * 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 getManyToMany($instance, $member, $array = null) { $ret = array(); $class = get_class($instance); $parser = new ManyToManyParser($instance, $member); if ($parser->init()) { $joinTableCursor = DAO::getSQLForJoinTable($instance, $parser); if (is_null($array)) { foreach ($joinTableCursor as $row) { $fkv = $row[$parser->getFkField()]; $tmp = DAO::getOne($parser->getTargetEntity(), "`" . $parser->getPk() . "`='" . $fkv . "'"); array_push($ret, $tmp); } } else { $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 ($joinTableCursor as $row) { $fkv = $row[$parser->getFkField()]; foreach ($array as $targetEntityInstance) { $instances = $targetEntityInstance->{$accessorToMember}(); if (is_array($instances)) { foreach ($instances as $inst) { if ($inst->{$myPkAccessor} == $instance->{$myPkAccessor}) { array_push($array, $targetEntityInstance); } } } } } } else { \Logger::warn("ManyToMany", "L'accesseur au membre " . $parser->getInversedBy() . " est manquant pour " . $parser->getTargetEntity()); } } $accessor = "set" . ucfirst($member); if (method_exists($instance, $accessor)) { \Logger::log("getManyToMany", "Chargement de " . $member . " pour l'objet " . $class); $instance->{$accessor}($ret); } else { \Logger::warn("getManyToMany", "L'accesseur " . $accessor . " est manquant pour " . $class); } } return $ret; }