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