30 public static function getManyToOne($instance, $member, $useCache=NULL) {
32 if($fieldAnnot!==null){
33 $field=$fieldAnnot[0];
35 $annotationArray=$fieldAnnot[1];
36 $member=$annotationArray[
"member"];
38 $kv=array ($key => $value );
39 $obj=self::getOne($annotationArray[
"className"], $kv,
false,
false, $useCache);
41 Logger::log(
"getManyToOne",
"Chargement de " . $member .
" pour l'objet " . \get_class($instance));
42 $accesseur=
"set" . ucfirst($member);
43 if (method_exists($instance, $accesseur)) {
44 $instance->$accesseur($obj);
45 $instance->_rest[$member]=$obj->_rest;
53 $elementAccessor=
"get" . ucfirst($mappedBy);
54 foreach ( $array as $element ) {
55 $elementRef=$element->$elementAccessor();
56 if (!is_null($elementRef)) {
58 if ($idElementRef == $fkv)
71 public static function getOneToMany($instance, $member, $useCache=NULL, $annot=null) {
73 $class=get_class($instance);
76 if ($annot !==
false) {
78 if ($fkAnnot !==
false) {
80 $ret=self::getAll($annot[
"className"], $fkAnnot[
"name"] .
"='" . $fkv .
"'",
true,
false, $useCache);
81 self::setToMember($member, $instance, $ret, $class,
"getOneToMany");
95 $class=get_class($instance);
96 if (!isset($mappedBy)){
98 $mappedBy=$annot[
"mappedBy"];
100 if ($mappedBy !==
false) {
102 self::_getOneToManyFromArray($ret, $array, $fkv, $mappedBy);
103 self::setToMember($member, $instance, $ret, $class,
"getOneToMany");
108 private static function setToMember($member, $instance, $value, $class, $part) {
109 $accessor=
"set" . ucfirst($member);
110 if (method_exists($instance, $accessor)) {
111 Logger::log($part,
"Affectation de " . $member .
" pour l'objet " . $class);
112 $instance->$accessor($value);
113 $instance->_rest[$member]=$value;
115 Logger::warn($part,
"L'accesseur " . $accessor .
" est manquant pour " . $class);
127 public static function getManyToMany($instance, $member,$array=null,$useCache=NULL){
129 $class=get_class($instance);
131 if ($parser->init()) {
132 if (is_null($array)) {
133 $accessor=
"get" . ucfirst($parser->getMyPk());
134 $condition=
" INNER JOIN `" . $parser->getJoinTable() .
"` on `".$parser->getJoinTable().
"`.`".$parser->getFkField().
"`=`".$parser->getTargetEntityTable().
"`.`".$parser->getPk().
"` WHERE `".$parser->getJoinTable().
"`.`". $parser->getMyFkField() .
"`='" . $instance->$accessor() .
"'";
135 $ret=self::getAll($parser->getTargetEntityClass(),$condition,
true,
false,$useCache);
137 self::getManyToManyFromArray($ret, $instance, $array, $class, $parser);
139 self::setToMember($member, $instance, $ret, $class,
"getManyToMany");
151 $manyToManyFields=$metaDatas[
"#manyToMany"];
152 if(\
sizeof($manyToManyFields)>0){
153 foreach ($manyToManyFields as $member){
154 self::getManyToMany($instance, $member,$array,$useCache);
161 $accessorToMember=
"get" . ucfirst($parser->getInversedBy());
162 $myPkAccessor=
"get" . ucfirst($parser->getMyPk());
164 if (!method_exists($instance, $myPkAccessor)) {
165 Logger::warn(
"ManyToMany",
"L'accesseur au membre clé primaire " . $myPkAccessor .
" est manquant pour " . $class);
167 if (
count($array) > 0)
168 $continue=method_exists($array[0], $accessorToMember);
170 foreach ( $array as $targetEntityInstance ) {
171 $instances=$targetEntityInstance->$accessorToMember();
172 if (is_array($instances)) {
173 foreach ( $instances as $inst ) {
174 if ($inst->$myPkAccessor() == $instance->$myPkAccessor())
175 array_push($ret, $targetEntityInstance);
180 Logger::warn(
"ManyToMany",
"L'accesseur au membre " . $parser->getInversedBy() .
" est manquant pour " . $parser->getTargetEntity());
193 public static function getAll($className, $condition=
'', $loadManyToOne=
true, $loadOneToMany=
false,$useCache=NULL) {
195 $invertedJoinColumns=null;
196 $oneToManyFields=null;
198 $tableName=$metaDatas[
"#tableName"];
199 if ($loadManyToOne && isset($metaDatas[
"#invertedJoinColumn"]))
200 $invertedJoinColumns=$metaDatas[
"#invertedJoinColumn"];
201 if ($loadOneToMany && isset($metaDatas[
"#oneToMany"])) {
202 $oneToManyFields=$metaDatas[
"#oneToMany"];
205 $members=\array_diff($metaDatas[
"#fieldNames"],$metaDatas[
"#notSerializable"]);
206 $query=self::$db->prepareAndExecute($tableName, $condition,$members,$useCache);
207 Logger::log(
"getAll",
"SELECT * FROM " . $tableName . $condition);
208 $oneToManyQueries=[];
209 $manyToOneQueries=[];
211 foreach ( $query as $row ) {
212 $object=self::loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields,$members, $oneToManyQueries,$manyToOneQueries);
214 $objects[$key]=$object;
217 if($loadManyToOne && \
sizeof($manyToOneQueries)>0){
218 self::_affectsObjectsFromArray($manyToOneQueries, $objects,
function($object,$member,$manyToOneObjects,$fkField){
219 self::affectsManyToOneFromArray($object,$member,$manyToOneObjects,$fkField);
223 if($loadOneToMany && \
sizeof($oneToManyQueries)>0){
224 self::_affectsObjectsFromArray($oneToManyQueries, $objects,
function($object,$member,$relationObjects,$fkField){
225 self::affectsOneToManyFromArray($object,$member,$relationObjects,$fkField);
231 public static function paginate($className,$page=1,$rowsPerPage=20,$condition=null){
232 if(!isset($condition)){
235 return self::getAll($className,$condition.
" LIMIT ".$rowsPerPage.
" OFFSET ".(($page-1)*$rowsPerPage));
240 self::parseKey($ids,$className);
243 return self::$db->queryColumn(
"SELECT num FROM (SELECT *, @rownum:=@rownum + 1 AS num FROM {$tableName}, (SELECT @rownum:=0) r ORDER BY {$keys}) d WHERE ".$condition);
247 foreach ($queries as $key=>$conditions){
248 list($class,$member,$fkField)=\explode(
"|", $key);
249 $condition=\implode(
" OR ", $conditions);
250 $relationObjects=self::getAll($class,$condition,
true,
false,$useCache);
251 foreach ($objects as $object){
252 $affectsCallback($object, $member,$relationObjects,$fkField);
258 $class=\get_class($object);
259 if(isset($object->$fkField)){
260 $value=$manyToOneObjects[$object->$fkField];
261 self::setToMember($member, $object, $value, $class,
"getManyToOne");
275 private static function loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields, $members,&$oneToManyQueries,&$manyToOneQueries) {
277 foreach ( $row as $k => $v ) {
278 if(($field=\array_search($k, $members))!==
false){
279 $accesseur=
"set" . ucfirst($field);
280 if (method_exists($o, $accesseur)) {
285 if (isset($invertedJoinColumns) && isset($invertedJoinColumns[$k])) {
288 self::prepareManyToOne($manyToOneQueries,$v, $fk,$invertedJoinColumns[$k]);
291 if (isset($oneToManyFields)) {
292 foreach ( $oneToManyFields as $k => $annot ) {
293 self::prepareOneToMany($oneToManyQueries,$o, $k, $annot);
308 $class=get_class($instance);
311 if ($annot !==
false) {
313 if ($fkAnnot !==
false) {
315 $key=$annot[
"className"].
"|".$member.
"|".$annot[
"mappedBy"];
316 if(!isset($ret[$key])){
319 $ret[$key][$fkv]=$fkAnnot[
"name"] .
"='" . $fkv .
"'";
332 $member=$annotationArray[
"member"];
334 $key=$annotationArray[
"className"].
"|".$member.
"|".$fkField;
335 if(!isset($ret[$key])){
338 $ret[$key][$value]=$fk .
"='" . $value .
"'";
347 public static function count($className, $condition=
'') {
349 if ($condition !=
'')
350 $condition=
" WHERE " . $condition;
351 return self::$db->query(
"SELECT COUNT(*) FROM " . $tableName . $condition)->fetchColumn();
363 public static function getOne($className, $keyValues, $loadManyToOne=
true, $loadOneToMany=
false, $useCache=NULL) {
364 self::parseKey($keyValues,$className);
367 if(\stripos($condition,
" limit ")===
false)
369 $retour=self::getAll($className, $condition.$limit, $loadManyToOne, $loadOneToMany,$useCache);
370 if (
sizeof($retour) < 1){
373 return \reset($retour);
376 private static function parseKey(&$keyValues,$className){
377 if (!is_array($keyValues)) {
378 if (strrpos($keyValues,
"=") ===
false && strrpos($keyValues,
">") ===
false && strrpos($keyValues,
"<") ===
false) {
395 public static function connect($dbType,$dbName, $serverName=
"127.0.0.1", $port=
"3306", $user=
"root", $password=
"", $options=[],$cache=
false) {
396 self::$db=
new Database($dbType,$dbName, $serverName, $port, $user, $password, $options,$cache);
398 self::$db->connect();
399 }
catch (\Exception $e) {
static getMemberJoinColumns($instance, $member, $metaDatas=NULL)
static _affectsObjectsFromArray($queries, $objects, $affectsCallback, $useCache=NULL)
static checkWhere($condition)
static getManyToOne($instance, $member, $useCache=NULL)
Loads member associated with $instance by a ManyToOne type relationship.
Trait for DAO Updates (Create, Update, Delete)
static parseKey(&$keyValues, $className)
static getRownum($className, $ids)
static error($id, $message, $code=0)
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...
static setToMember($member, $instance, $value, $class, $part)
static getAnnotationInfoMember($class, $keyAnnotation, $member)
static connect($dbType, $dbName, $serverName="127.0.0.1", $port="3306", $user="root", $password="", $options=[], $cache=false)
Establishes the connection to the database using the past parameters.
static paginate($className, $page=1, $rowsPerPage=20, $condition=null)
static getCondition($keyValues, $classname=NULL, $separator=" AND ")
static affectsOneToManyFromArray($instance, $member, $array=null, $mappedBy=null)
static getFirstKey($class)
static getManyToManyFromArray(&$ret, $instance, $array, $class, $parser)
static prepareManyToOne(&$ret, $value, $fkField, $annotationArray)
Prepares members associated with $instance with a manyToOne type relationship.
static getFirstKeyValue($instance)
static getManyToMany($instance, $member, $array=null, $useCache=NULL)
Assigns / loads the child records in the $member member of $instance.
static getAll($className, $condition='', $loadManyToOne=true, $loadOneToMany=false, $useCache=NULL)
Returns an array of $className objects from the database.
static count($className, $condition='')
Returns the number of objects of $className from the database respecting the condition possibly passe...
static getMemberValue($instance, $member)
static isConnected()
Returns true if the connection to the database is estabished.
static log($id, $message, $code=0)
static getModelMetadata($className)
static getTableName($class)
static warn($id, $message, $code=0)
static affectsManyToOneFromArray($object, $member, $manyToOneObjects, $fkField)
static getOneToMany($instance, $member, $useCache=NULL, $annot=null)
Assign / load the child records in the $member member of $instance.
static prepareOneToMany(&$ret, $instance, $member, $annot=null)
Prepares members associated with $instance with a oneToMany type relationship.
static loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields, $members, &$oneToManyQueries, &$manyToOneQueries)
static _getOneToManyFromArray(&$ret, $array, $fkv, $mappedBy)
static getKeyFields($instance)
static affectsManyToManys($instance, $array=NULL, $useCache=NULL)