Mysql
 sql >> Database >  >> RDS >> Mysql

i record attivi codeigniter si uniscono con using?

Non esiste un supporto integrato per JOIN ... USING nella classe di registrazione attiva. La soluzione migliore sarebbe probabilmente cambiare il join() funzione in modo che sia così (il file è system/database/DB_active_rec.php nel caso non lo sapessi)

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

Quindi, puoi semplicemente usarlo nel tuo codice join('table', 'USING ("something")')

Tuttavia, potresti voler estendere la classe invece di modificarla in modo da non dover fare la stessa cosa più e più volte quando aggiorni il tuo CI. Dai un'occhiata a questo articolo o questo (o cerca su google) se vuoi farlo invece.

Oppure, se non vuoi affrontare tutti quei problemi, puoi scrivere una semplice funzione di supporto che può fare la stessa cosa.

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

Successivamente, carica l'helper e chiama la funzione in questo modo join_using('table', 'key') . Quindi produrrà lo stesso risultato che avresti con l'originale join() tranne che questo ti darà USING invece di ON condizione.

Ad esempio:

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