sql >> Databasteknik >  >> RDS >> Mysql

codeigniter aktiva poster förena med att använda?

Det finns inget inbyggt stöd för JOIN ... USING i den aktiva rekordklassen. Din bästa insats skulle förmodligen ändra join() funktion för att vara så här (filen är system/database/DB_active_rec.php om du inte vet)

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

Så då kan du helt enkelt använda detta i din kod join('table', 'USING ("something")')

Även om du kanske vill utöka klassen istället för att ändra den så att du inte behöver göra samma sak om och om igen när du uppgraderar din CI. Ta en titt på denna artikel eller denna (eller sök på google) om du vill göra det istället.

Eller om du inte vill gå igenom alla dessa problem kan du skriva en enkel hjälpfunktion som kan göra samma sak.

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

Senare laddar du bara in hjälpen och anropar funktionen så här join_using('table', 'key') . Det kommer då att ge samma resultat som du skulle göra med den ursprungliga join() förutom att den här ger dig USING istället för ON skick.

Till exempel:

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



  1. skapa användare i mysql med java

  2. MySQL Query - får saknade poster när du använder group-by

  3. MySQL:GROUP_CONCAT med LEFT JOIN

  4. while($row =mysql_fetch_array($query)) fungerar inte på andra gången