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

codeigniter aktive poster slutte sig til at bruge?

Der er ingen indbygget understøttelse af JOIN ... USING i den aktive rekordklasse. Dit bedste bud ville sandsynligvis ændre join() funktion til at være sådan (filen er system/database/DB_active_rec.php hvis du ikke ved det)

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å du kan simpelthen bruge dette i din kode join('table', 'USING ("something")')

Selvom du måske ønsker at udvide klassen i stedet for at ændre den, så du ikke behøver at gøre det samme igen og igen, når du opgraderer dit CI. Tag et kig på denne artikel eller denne (eller søg på google), hvis du vil gøre det i stedet for.

Eller hvis du ikke vil løse alle de problemer, kan du skrive en simpel hjælpefunktion, der kan gøre det samme.

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

Senere skal du bare indlæse hjælperen og kalde funktionen som denne join_using('table', 'key') . Det vil derefter producere det samme resultat, som du ville med den originale join() bortset fra at denne vil give dig USING i stedet for ON tilstand.

For eksempel:

// $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. Oracle eksterne tabeller

  2. 4 måder at tælle rækker i SQL Server-tabel med fordele og ulemper

  3. PostgreSQL konverterede forkert fra tidsstempel uden tidszone til tidsstempel med tidszone

  4. Laravel 5.5 pivot join for at få pivot værdier med hoved MySQL resultat