2009-04-27 15 views
6

के साथ डेटा पुनर्प्राप्त करना मैं PHP/MySQL के लिए नया हूं और कोडइग्निटर के लिए सुपर-न्यू .. मेरे पास कई MySQL तालिकाओं में जानकारी है। मैं इसे जॉइन के साथ पुनर्प्राप्त करना चाहता हूं जहां टेबल प्राथमिक कुंजी $ चर के बराबर होती हैं ... मैं इसे कैसे कर सकता हूं और प्राथमिक फ़ील्ड के बिना सभी फ़ील्ड प्राप्त कर सकता हूं ???कोडइग्निटर/PHP/MySQL: जॉइन

क्या मैं अब कर रहा हूँ इस (केवल दो तालिकाओं यहाँ शामिल हो गए) है:

function getAll($id) { 

    $this->db->select('*'); 
    $this->db->from('movies'); 
    $this->db->join('posters', 'movies.id= posters.id'); 
    // WHERE id = $id ... goes here somehow... 
    $q = $this->db->get(); 

    if ($q->num_rows() == 1) { 
     $row = $q->row(); 
     $data = array(
       'id' => $row->id, 
       'title' => $row->title, 
       'year' => $row->year, 
       'runtime' => $row->runtime, 
       'plotoutline' => $row->plotoutline, 
       'poster_url' => $row->poster_url 
      ); 
    } 

    $q->free_result(); 
    return $data; 

आईडी (पी), शीर्षक, साल, क्रम और plotoutline पहले तालिका में कॉलम होते हैं और poster_url एक क्षेत्र है दूसरी मेज से। दूसरी तालिका में एक आईडी (पीके) कॉलम भी शामिल है जिसे मैं पुनर्प्राप्त नहीं करना चाहता क्योंकि मेरे पास पहले से ही है।

उत्तर

21

जॉन सही है। यहाँ एक उदाहरण है:

$this->db->select('movies.id, 
        movies.title, 
        movies.year, 
        movies.runtime as totaltime, 
        posters.poster_url'); 
$this->db->from('movies'); 
$this->db->join('posters', 'movies.id= posters.id'); 
$this->db->where('movies.id', $id); 
$q = $this->db->get(); 

यह वस्तुओं है कि वापस आ जाएगी -> आईडी, -> शीर्षक, -> साल, -> totaltime, और -> poster_url गुण। प्रत्येक पंक्ति से डेटा लाने के लिए आपको अतिरिक्त कोड की आवश्यकता नहीं होगी।

याद रखें, सक्रिय रिकॉर्ड वाक्य रचना एक छोटे से बोझल हो जाता है, तो आप एक ही परिणाम पूर्ण एसक्यूएल प्रश्नों का उपयोग और प्राप्त कर सकते हैं:

$sql = "SELECT movies.id, 
     movies.title, 
     movies.year, 
     movies.runtime as totaltime, 
     posters.poster_url 
     FROM movies 
     INNER JOIN posters ON movies.id = posters.id 
     WHERE movies.id = ?" 

return $this->db->query($sql, array($id))->result(); 

दोनों रूपों सुनिश्चित करेगा कि आपके डेटा ठीक से बच रहा है।

CodeIgniter Active Record

Query Binding in CodeIgniter

+0

इस तरह से मैं दो तालिकाओं के बीच में शामिल होने और सभी परिणाम सही मिलेगा? मैं डेटा प्राप्त करने के लिए टीटीएच पंक्ति से आईडी कैसे निर्दिष्ट कर सकता हूं ?? कुछ कहां 'WHERE movies.id = $ id' .. – Jonathan

+0

मैंने ऊपर कुछ और जानकारी जोड़ दी है। :) – GloryFish

+0

क्या 'सक्रिय रिकॉर्ड' और विनियमन एसक्यूएल कोड के बीच कोई प्रदर्शन अंतर है ??? – Jonathan

4

एक तारांकन सभी क्षेत्रों को वापस कर देगा। इन सबसेट को वापस करने के लिए, यानी सभी फ़ील्ड अलग-अलग आईडी फ़ील्ड को अलग करते हैं, बस '*' के बजाय आपको आवश्यक कॉलम सूचीबद्ध करें।

वैसे भी तारांकन का उपयोग न करना एक अच्छा विचार है। ऐप के भविष्य में, कोई भी तालिका में एक बड़ा फ़ील्ड जोड़ सकता है जो आपकी आवश्यकताओं के लिए अधिशेष होगा, और आपके प्रश्नों को धीमा कर देगा।

1

सीधे शब्दों में विधि श्रृंखलन के साथ डाल दिया:

$this->db->select('*') 
     ->from('movies') 
     ->join('posters', 'movies.id= posters.id') 
     ->where('movies.id', $id) 
     ->get(); 
0
$this->db->select('*'); 
$this->db->from('blogs'); 
$this->db->join('comments', 'comments.id = blogs.id'); 
$query = $this->db->get(); 
संबंधित मुद्दे