Không có hỗ trợ tích hợp cho JOIN ... USING
trong lớp ghi hoạt động. Tốt nhất bạn nên thay đổi join()
chức năng như thế này (tệp là system/database/DB_active_rec.php
trong trường hợp bạn không biết)
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;
}
Vì vậy, bạn có thể chỉ cần sử dụng điều này trong mã của mình join('table', 'USING ("something")')
Mặc dù vậy, bạn có thể muốn mở rộng lớp thay vì sửa đổi nó để bạn không cần phải làm lại nhiều việc khi nâng cấp CI của mình. Hãy xem phần này bài viết hoặc this (hoặc tìm kiếm trên google) nếu bạn muốn thay thế.
Hoặc nếu bạn không muốn gặp phải những rắc rối đó, bạn có thể viết một hàm trợ giúp đơn giản có thể làm điều tương tự.
<?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;
}
Sau đó, chỉ cần tải trình trợ giúp và gọi hàm như sau join_using('table', 'key')
. Sau đó, nó sẽ tạo ra kết quả giống như bạn làm với join()
ban đầu ngoại trừ cái này sẽ cung cấp cho bạn USING
thay vì ON
điều kiện.
Ví dụ:
// $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);