sql >> Base de Datos >  >> RDS >> Mysql

¿Los registros activos de codeigniter se unen con el uso?

No hay soporte incorporado para JOIN ... USING en la clase de registro activa. Su mejor apuesta probablemente cambiaría join() función para ser así (el archivo es system/database/DB_active_rec.php en caso de que no lo sepas)

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;
}

Entonces, simplemente puede usar esto en su código join('table', 'USING ("something")')

Aunque, es posible que desee ampliar la clase en lugar de modificarla para que no tenga que hacer lo mismo una y otra vez cuando actualice su CI. Eche un vistazo a esto artículo o este (o busca en google) si quieres hacerlo.

O si no quiere pasar por todos esos problemas, puede escribir una función de ayuda simple que pueda hacer lo mismo.

<?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;
}  

Más tarde, simplemente cargue el asistente y llame a la función como esta join_using('table', 'key') . Entonces producirá el mismo resultado que lo haría con el join() original excepto que este te dará USING en lugar de ON condición.

Por ejemplo:

// $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);