Nie ma wbudowanej obsługi JOIN ... USING
w klasie active record. Twój najlepszy zakład prawdopodobnie zmieni join()
funkcja taka jak ta (plik to system/database/DB_active_rec.php
jeśli nie wiesz)
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;
}
Więc możesz po prostu użyć tego w swoim kodzie join('table', 'USING ("something")')
Chociaż możesz chcieć rozszerzyć klasę zamiast modyfikować ją, aby nie trzeba było robić tego samego w kółko po uaktualnieniu CI. Spójrz na ten artykuł lub ten (lub wyszukaj google), jeśli chcesz to zrobić zamiast tego.
Lub jeśli nie chcesz sprawiać kłopotów, możesz napisać prostą funkcję pomocniczą, która zrobi to samo.
<?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;
}
Później po prostu załaduj helper i wywołaj funkcję w ten sposób join_using('table', 'key')
. Następnie da taki sam wynik, jak w przypadku oryginalnego join()
z wyjątkiem tego da ci USING
zamiast ON
stan.
Na przykład:
// $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);