Neexistuje žádná vestavěná podpora pro JOIN ... USING
ve třídě aktivních záznamů. Nejlepší by bylo pravděpodobně změnit join()
funkce je taková (soubor je system/database/DB_active_rec.php
v případě, že nevíte)
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;
}
Takže to můžete jednoduše použít ve svém kódu join('table', 'USING ("something")')
I když možná budete chtít třídu rozšířit místo její úpravy, takže při upgradu CI nebudete muset dělat to samé znovu a znovu. Podívejte se na tento článek nebo tento (nebo hledejte na google), pokud to chcete udělat.
Nebo pokud se nechcete pouštět do všech těch problémů, můžete napsat jednoduchou pomocnou funkci, která umí to samé.
<?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;
}
Později stačí načíst pomocníka a zavolat funkci takto join_using('table', 'key')
. Potom vytvoří stejný výsledek, jako byste vytvořili s původním join()
kromě tohoto vám dá USING
místo ON
podmínka.
Například:
// $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);