/** * 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)); }
/** * 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)); }
/** * 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; }