Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Codeigniter aktive Aufzeichnungen beitreten mit der Verwendung?

Es gibt keine integrierte Unterstützung für JOIN ... USING in der aktiven Rekordklasse. Am besten ändern Sie wahrscheinlich join() Funktion so aussehen (die Datei ist system/database/DB_active_rec.php falls Sie es nicht wissen)

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

Dann können Sie dies einfach in Ihrem Code verwenden join('table', 'USING ("something")')

Vielleicht möchten Sie die Klasse jedoch erweitern, anstatt sie zu ändern, damit Sie nicht immer wieder dasselbe tun müssen, wenn Sie Ihr CI aktualisieren. Sehen Sie sich dieses Artikel oder this one (oder suchen Sie bei Google), wenn Sie dies stattdessen tun möchten.

Oder wenn Sie all diese Probleme vermeiden möchten, können Sie eine einfache Hilfsfunktion schreiben, die dasselbe tun kann.

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

Später laden Sie einfach den Helfer und rufen die Funktion wie folgt auf:join_using('table', 'key') . Es wird dann das gleiche Ergebnis erzeugen wie mit dem ursprünglichen join() außer dieser gibt Ihnen USING statt ON Zustand.

Zum Beispiel:

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