2012-04-06 17 views
14

में कोडइग्निटर ActiveRecord फ़ील्ड नाम जॉइन शामिल एक क्वेरी बना रहा हूं। यह पहली बार है जब मैंने सक्रिय रिकॉर्ड के साथ डीबी सामान किया है और मैंने थोड़ा सा झटका लगाया है।जॉइन स्टेटमेंट

मैं एक मेज शामिल करना चाहते हैं users मेज पर companies कहा जाता है तो मैं कंपनी आदि उपयोगकर्ता में है के नाम पर प्राप्त कर सकते हैं मैं सफलतापूर्वक इसलिए की तरह की इस तरह किया है:।

function get_profile_by_username($username) 
{ 
    $this->db->join('companies', $this->table_name.'.company_id = companies.id'); 
    $this->db->where('LOWER(username)=', strtolower($username)); 
    $query = $this->db->get($this->table_name); 
    if ($query->num_rows() == 1) return $query->row(); 
    return NULL; 
} 

हालांकि मुद्दा यह है कि companies में फ़ील्ड, वे id और name उस ऑब्जेक्ट में वापस लौटे हैं जैसे कि name

आम तौर पर जब मैं कच्ची क्वेरी लिखता हूं तो मैं टेबल पर उपनाम देता हूं और परिणाम u.company_id, c.name जैसा कुछ होगा। तो मुझे पता होगा कि name उपयोगकर्ता के साथ कुछ लेना देना नहीं था लेकिन निश्चित रूप से कंपनी का नाम है। और हालांकि भविष्य में संभावित रूप से कोई समस्या नहीं है, id कॉलम स्पष्ट रूप से परिणाम सेट में सह-अस्तित्व में नहीं हो सकता है, इसलिए कोई ओवरराइट हो जाता है!

हम कुछ तालिकाओं से आने वाले क्षेत्रों के बीच इस तरह के अंतर को कैसे प्राप्त कर सकते हैं? या क्या तालिका में शामिल होने और जुड़ने वाले क्वेरी डेटा सेट/ऑब्जेक्ट्स के साथ काम करने का एक बेहतर तरीका है?

संपादित करें:

अगर मैं एक कच्चे क्वेरी के रूप में यह कर रहा था मुझे क्या करना चाहते हैं:

SELECT u.id, u.username, c.name 
FROM users AS u 
JOIN companies AS c 
ON c.id = u.company_id 
WHERE u.username = 'foobar'; 

कौन महान है लेकिन अगर मुझे लगता है कि सक्रिय रिकॉर्ड में मुझे लगता है करने की कोशिश की है कि बहुत गरीब अभ्यास है , अगर यह बिल्कुल काम करता है।

उत्तर

36

यदि आप तालिका उपयोग से कुछ विशिष्ट कॉलम चुनना चाहते हैं db->select()। आप तालिकाओं को उपनाम दे सकते हैं, कुछ शर्तों और आदि जोड़ सकते हैं। विशेष वर्णों से बचने के लिए दूसरा पैरामीटर FALSE भेजें।

$this->db->select('u.id, u.username, c.name', false); 
$this->db->from('user as u'); 
$this->db->join('companies as c', 'u.company_id = c.id'); 
$this->db->where('LOWER(u.username)=', strtolower('foobar')); 
$query = $this->db->get(); 
+0

मैंने सोचा कि मुझे इसका सहारा लेना पड़ सकता है, लेकिन मुझे विश्वास नहीं था कि मैं इस तरह का चयन करने में सक्षम हूं। मैं अपने उदाहरण जैसे तालिकाओं को उपनाम कैसे दे सकता हूं, कुछ '-> प्राप्त करें (' उपयोगकर्ता AS u ')'? क्या यह सभी Activerecord डेटाबेस लक्ष्यों के साथ संगत होगा? – deed02392

+0

@ deed02392 चेक, अद्यतन कोड – safarov

+0

ठीक है जैसा मैंने सोचा था। 'एएस' ऑपरेटर मानक एसक्यूएल सही है, यह सभी डीबी भाषाओं में उपनाम सेट करता है? या यह केवल प्रमाणित डीबी में काम करेगा। – deed02392

संबंधित मुद्दे