2011-09-11 100 views
2

我想寫這個查詢:使用的代碼點火器活動記錄類codeigniter活動記錄加入使用?

SELECT u.userId, uil.interestId, url.regionId FROM users u 
    JOIN userInterestLink uil USING (userId) 
    JOIN userRegionLink url USING (userId) 
    JOIN dealInterestLink dil USING (interestId) 
    JOIN dealRegionLink drl USING (regionId, dealId) 
WHERE dealId = 1 

,但是我沒有ideda怎麼辦JOIN ... USING

回答

3

有沒有內置支持在JOIN ... USING活躍的記錄類。你最好的選擇可能會改變join()功能是這樣的(該文件是system/database/DB_active_rec.php如果你不知道)

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

那麼,你可以簡單地在你的代碼中使用此join('table', 'USING ("something")')

雖然,您可能需要擴展該類而不是修改它,以便在升級CI時不需要一遍又一遍地重複執行相同的操作。 看看這articlethis one(或谷歌搜索),如果你想這樣做,而不是。或者,如果你不想遇到所有這些麻煩,你可以寫一個簡單的助手函數來完成同樣的事情。

<?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; 
} 

稍後,只需加載助手並調用像這樣的函數join_using('table', 'key')。然後它會產生與原始join()相同的結果,除了這一個將給你USING而不是ON條件。

例如:

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