示例#1
0
 /**
  * Implements magic method __sleep()
  * Collapes field map to an array
  */
 public function __sleep()
 {
     // collapse field map
     $this->fm = array($this->fm->getClassMap()->getName(), $this->fm->getName());
     return array_keys(get_object_vars($this));
 }
示例#2
0
 /**
  * Implements magic method __sleep()
  * Collapes field map to an array
  */
 public function __sleep()
 {
     // collapse field map if still an object
     if (is_object($this->fm)) {
         $this->fm = array($this->fm->getClassMap()->getName(), $this->fm->getName());
     }
     return array_keys(get_object_vars($this));
 }
示例#3
0
 /**
  * Returns the relation ids for the variable specified of the object
  * @param epObject $o the object
  * @param epFieldMap $fm the field map of the variable
  * @param epClassMap $cm the class map of the object
  * @return false|string|array
  */
 public function getRelationIds(&$o, $fm, $cm)
 {
     // make sure we are dealing with valid object and non-primitive field
     if (!$o || !$fm || !$cm) {
         return false;
     }
     // object needs to have a valid id and has to be non-primitive
     if (!($oid_a = $o->epGetObjectId())) {
         return false;
     }
     // get class_a, var_a, and the related class
     $base_a = $fm->getClassMap()->getName();
     $class_a = $cm->getName();
     $var_a = $fm->getName();
     $base_b = $fm->getClass();
     if (!$base_a || !$class_a || !$var_a || !$base_b) {
         throw new epExceptionManager('Cannot find related class for var [' . $class_a . '::' . $var_a . ']');
         return false;
     }
     // switch relations table
     $this->_setRelationTable($base_a, $base_b);
     // make an example relation objects
     if (!($eo =& $this->_relationExample($class_a, $oid_a, $var_a, $base_b))) {
         return false;
     }
     // find all relation objects using the example object
     $rs =& parent::find($eo, EP_GET_FROM_DB, false);
     // find from db only, false no cache
     // convert result into oids
     $oids_b = null;
     if ($fm->isSingle()) {
         if (is_array($rs) && count($rs) > 1) {
             throw new epExceptionManager('Field ' . $fm->getName() . ' mapped as composed_of_/has_one but is associated with > 1 objects');
             return false;
         }
         if ($rs) {
             $oids_b = $this->_encodeClassOid($rs[0]->get_class_b(), $rs[0]->get_oid_b());
         }
     } else {
         if ($fm->isMany()) {
             $oids_b = array();
             if ($rs) {
                 foreach ($rs as $r) {
                     $oids_b[] = $this->_encodeClassOid($r->get_class_b(), $r->get_oid_b());
                 }
             }
         }
     }
     return $oids_b;
 }
 /**
  * Make where part of a SQL select for relationship fields
  * @param epDbObject $db the db connection  
  * @param epFieldMap $fm the field map
  * @param epClassMap $cm the child object for query
  * @param string $alias the alias of this table in the previous part
  * @return array('from', 'where')
  * @author Oak Nauhygon <*****@*****.**>
  * @author Trevan Richins <*****@*****.**>
  */
 public static function sqlSelectRelations($db, $fm, $cm, $table, $alias, $parentTable)
 {
     $base_a = $fm->getBase_a();
     $class_a = $cm->getName();
     $var_a = $fm->getName();
     $base_b = $fm->getBase_b();
     // call manager to get relation table for base class a and b
     $rt = epManager::instance()->getRelationTable($base_a, $base_b);
     // the alias of the table we are dealing with right now
     $tbAlias = '_' . $alias;
     $rtAlias = 'rt' . $alias;
     // quoted aliases (avoid repeating)
     $tbAlias_q = $db->quoteId($tbAlias);
     $rtAlias_q = $db->quoteId($rtAlias);
     // compute 'from' parts: tables with aliases
     $from = array();
     $from[] = $db->quoteId($table) . ' AS ' . $tbAlias_q;
     $from[] = $db->quoteId($rt) . ' AS ' . $rtAlias_q;
     // compute expressions 'where'
     $where = array();
     // rt.class_a =
     $where[] = $rtAlias_q . '.' . $db->quoteId('class_a') . ' = ' . $db->quote($class_a);
     // rt.var_a =
     $where[] = $rtAlias_q . '.' . $db->quoteId('var_a') . ' = ' . $db->quote($var_a);
     // rt.base_b =
     $where[] = $rtAlias_q . '.' . $db->quoteId('base_b') . ' = ' . $db->quote($base_b);
     // rt.class_b =  TODO: doesn't look like it is used
     //$where .= 'rt.'.$db->quoteId('class_b') . ' = ' . $db->quote($val->getClass());
     // A.oid = rt.oid_a
     $where[] = $db->quoteId($parentTable) . '.' . $db->quoteId($cm->getOidColumn()) . ' = ' . $rtAlias_q . '.' . $db->quoteId('oid_a');
     // Child.oid = rt.oid_b
     $where[] = $tbAlias_q . '.' . $db->quoteId($fm->getClassMap()->getOidColumn()) . ' = ' . $rtAlias_q . '.' . $db->quoteId('oid_b');
     return array('from' => $from, 'where' => $where);
 }
 /**
  * Builds SQL statements for a relationship field map.
  * @param epFieldMap $fm
  * @param string $alias_a the alias of the parent class
  * @return string|array (error message if string)
  */
 protected function _buildSqlFieldMapRelationship($fm, $alias_a = self::DUMMY_ALIAS)
 {
     // get cm_a, base_a, var_a, base_b
     $cm_a = $fm->getClassMap();
     $base_a = $cm_a->getName();
     $var_a = $fm->getName();
     $base_b = $fm->getClass();
     // call manager to get relation table for base class a and b
     if (!($rt = $this->em->getRelationTable($base_a, $base_b))) {
         return "[Internal] No relationship table for [{$base_a}] and [{$base_b}]";
     }
     // change base_a to the actual child being used
     if ($base_a == $this->root_class) {
         $base_a = $this->aliases[$this->root_alias];
     }
     // alias for rt relation table
     $rta = $this->qid($this->generateRtAlias($rt));
     // get class map for base_b
     if (!($cm_base_b = $this->em->getClassMap($base_b))) {
         return "[Internal] No class map for [{$base_b}]";
     }
     // get all subclasses of base_b (true: recursive)
     if (!($cms_b = $cm_base_b->getChildren(true))) {
         // make sure we have an array even if no subclasses
         $cms_b = array();
     }
     // add base_b into array
     $cms_b[] = $cm_base_b;
     // quote value or id (avoid repeating!)
     $alias_a = $this->qid($alias_a);
     $class_a = $this->q($base_a);
     $var_a = $this->q($var_a);
     $oid_a = $this->qid($cm_a->getOidColumn());
     $base_b = $this->q($base_b);
     // array to keep OR conditions
     $wheres = array();
     // go through each subclass
     foreach ($cms_b as $cm_b) {
         // get class_b and generate an alias
         $class_b = $this->q($cm_b->getName());
         $alias_b = $this->qid($alias_b_ = $this->generateAlias($class_b));
         $oid_b = $this->qid($cm_b->getOidColumn());
         // array to keep all AND where conditions
         $where = array();
         $where[] = $rta . '.class_a = ' . $class_a;
         $where[] = $rta . '.var_a = ' . $var_a;
         $where[] = $rta . '.oid_a = ' . $alias_a . '.' . $oid_a;
         $where[] = $rta . '.base_b = ' . $base_b;
         $where[] = $rta . '.class_b = ' . $class_b;
         $where[] = $rta . '.oid_b = ' . $alias_b . '.' . $oid_b;
         // put into AND array
         $wheres[$alias_b_] = implode(' AND ', $where);
         // $alias_b_: alias_b before quoting
     }
     return $wheres;
 }