Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

registros ativos do codeigniter juntam-se ao uso?


Não há suporte integrado para JOIN ... USING na classe de registro ativo. Sua melhor aposta provavelmente mudaria o join() função seja assim (o arquivo é system/database/DB_active_rec.php caso não saiba)
public function join($table, $cond, $type = '')
{
    if ($type != '')
    {
        $type = strtoupper(trim($type));

        if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER')))
        {
            $type = '';
        }
        else
        {
            $type .= ' ';
        }
    }

    // Extract any aliases that might exist.  We use this information
    // in the _protect_identifiers to know whether to add a table prefix
    $this->_track_aliases($table);

    // Strip apart the condition and protect the identifiers
    if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match))
    {
        $match[1] = $this->_protect_identifiers($match[1]);
        $match[3] = $this->_protect_identifiers($match[3]);

        $cond = $match[1].$match[2].$match[3];
    }

    // Assemble the JOIN statement
    $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE);

    $using_match = preg_match('/using[ (]/i', $cond);

    if ($using_match)
    {
        $join .= $cond;
    }
    else
    {
        $join .= ' ON '.$cond;
    }

    $this->ar_join[] = $join;
    if ($this->ar_caching === TRUE)
    {
        $this->ar_cache_join[] = $join;
        $this->ar_cache_exists[] = 'join';
    }

    return $this;
}

Então, você pode simplesmente usar isso em seu código join('table', 'USING ("something")')

No entanto, talvez você queira estender a classe em vez de modificá-la para não precisar fazer a mesma coisa repetidamente ao atualizar seu CI. Dê uma olhada em artigo ou este (ou pesquise no google) se você quiser fazer isso.

Ou se você não quiser ter todos esses problemas, você pode escrever uma função auxiliar simples que pode fazer a mesma coisa.
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

function join_using($table, $key) 
{
    $CI = get_instance();
    $join = 'JOIN '. $table .' USING (`'. $key .'`)';
    return $CI->db->ar_join[] = $join;
}  

Mais tarde, basta carregar o auxiliar e chamar a função assim join_using('table', 'key') . Ele produzirá o mesmo resultado que você faria com o join() original exceto que este lhe dará USING em vez de ON doença.

Por exemplo:
// $something1 and $something2 will produce the same result.
$something1 = $this->db->join('join_table', 'join_table.id = table.id')->get('table')->result();
print_r($something1);
join_using('join_table', 'id');
$something2 = $this->db->get('table')->result();
print_r($something2);