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