/** * 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->metadata()->getTablename(); } } // 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->metadata()->getTablename(), $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->metadata()->getClassname() == $this_ent->metadata()->getClassname() && $ent->alias() == $this_ent->alias()) { // 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; }