Mysql
 sql >> Base de données >  >> RDS >> Mysql

les enregistrements actifs de codeigniter se joignent à l'utilisation ?

Il n'y a pas de support intégré pour JOIN ... USING dans la classe d'enregistrement active. Votre meilleur pari serait probablement de changer le join() fonction pour être comme ça (le fichier est system/database/DB_active_rec.php au cas où vous ne le sauriez pas)

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

Alors, vous pouvez simplement l'utiliser dans votre code join('table', 'USING ("something")')

Cependant, vous voudrez peut-être étendre la classe au lieu de la modifier afin de ne pas avoir à refaire la même chose encore et encore lorsque vous mettez à niveau votre CI.Jetez un œil à ceci article ou celui-ci (ou recherchez sur Google) si vous préférez le faire à la place.

Ou si vous ne voulez pas vous compliquer la vie, vous pouvez écrire une simple fonction d'assistance qui peut faire la même chose.

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

Plus tard, chargez simplement l'assistant et appelez la fonction comme ceci join_using('table', 'key') . Il produira alors le même résultat que vous le feriez avec le join() d'origine sauf que celui-ci vous donnera USING au lieu de ON état.

Par exemple :

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