/** * Recupera o dialeto para o objeto * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param Lumine_Base $obj * @return ILumine_Dialect */ public static function get(Lumine_Base $obj) { $dialect = $obj->_getConfiguration()->getProperty('dialect'); $id = $obj->_getObjectPart('_objectID'); if (!array_key_exists($dialect, self::$createdItems)) { Lumine::load('Lumine_Dialect_' . $dialect); $ref = new ReflectionClass('Lumine_Dialect_' . $dialect); self::$createdItems[$dialect] = $ref->newInstance(); } self::$createdItems[$dialect]->setConnection($obj->_getConnection()); self::$createdItems[$dialect]->setObjectId($id); self::$createdItems[$dialect]->setTablename($obj->tablename()); return self::$createdItems[$dialect]; }
/** * Permite adicionar um JOIN com uma expressao livre. * * @param Lumine_Base $obj Objeto que sera unido * @param string $expression Expressao que sera utilizada no join * @param string $alias Apelido para a classe que esta sendo unida * @author Hugo Ferreira da Silva * @return Lumine_Base o proprio objeto */ public function joinExpression($obj, $type, $expression, $alias = null) { $type = trim(strtoupper($type)); if (!preg_match('@^(LEFT|LEFT OUTER|INNER|RIGHT|RIGHT OUTER|CROSS)$@', $type)) { throw new Lumine_Exception('Tipo nao suportado: ' . $type, Lumine_Exception::ERROR); } // se indicar o alias if (!is_null($alias)) { $obj->alias($alias); } else { $alias = $obj->alias(); if (empty($alias)) { $alias = $obj->tablename(); } } // pega a lista de join's do objeto que esta sendo unido $list = $obj->_getObjectPart('_join_list'); // reinicia a lista de join's deste objeto reset($this->_join_list); // argumentos extras $args = func_get_args(); array_splice($args, 0, 4); $expression = trim($expression); // remove espacos em branco try { $expression = Lumine_Parser::parsePart($obj, $expression, $args); // faz o parser para certificacao que os campos existem certinho $expression = Lumine_Parser::parseEntityNames($obj, $expression); } catch (Exception $e) { try { $expression = Lumine_Parser::parsePart($this, $expression, $args); // faz o parser para certificacao que os campos existem certinho $expression = Lumine_Parser::parseEntityNames($this, $expression); } catch (Exception $e) { Lumine_Log::warning('Houve um erro na analise da condicao extra'); } } // adiciona a expressao $this->_join[] = sprintf('%s JOIN %s %s ON %s', $type, $obj->tablename(), $alias, $expression); // para cada item na lista do objeto alvo foreach ($list as $ent) { // indica que pode adicionar $add = true; // para cada item na lista deste objeto foreach ($this->_join_list as $this_ent) { // se for a mesma classe e tiver o mesmo alias if ($ent->_getName() == $this_ent->_getName() && $ent->_getAlias() == $this_ent->_getAlias()) { // nao pode fazer o join $add = false; break; } } // se nao puder fazer o join if (!$add) { // pula para o proximo item continue; } // ok pode adicionar $this->_join_list[] = $ent; $this->_join = array_merge($this->_join, $ent->_getStrJoinList()); // faz o where $where = $ent->_makeWhereFromFields(); // se teve condicoes if (!empty($where)) { // inclui neste objeto $this->where($where); } } // deixa a lista unica $this->_join = array_unique($this->_join); return $this; }