2009-04-27 45 views
6

Tôi mới sử dụng PHP/MySQL và siêu mới đối với CodeIgniter .. Tôi có thông tin trong nhiều bảng MySQL. Tôi muốn lấy nó với JOIN, nơi các khóa chính của bảng bằng $ variable ... Làm thế nào tôi có thể làm điều đó và nhận được tất cả các trường mà không có trường khóa chính?CodeIgniter/PHP/MySQL: Lấy dữ liệu với JOIN

Những gì tôi đang làm bây giờ là thế này (chỉ có hai bảng tham gia ở đây):

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; 

id (PK), tiêu đề, năm, thời gian chạy và plotoutline là các cột từ bảng đầu tiên và poster_url là một lĩnh vực từ bảng thứ hai. Bảng thứ hai cũng chứa một cột ID (PK) mà tôi không muốn Truy xuất vì tôi đã có.

Trả lời

21

Jon nói đúng. Dưới đây là ví dụ:

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

Điều này sẽ trả về các đối tượng có -> id, -> title, -> year, -> totaltime và -> poster_url properties. Bạn sẽ không cần mã bổ sung để tìm nạp dữ liệu từ mỗi hàng.

Đừng quên, nếu Ghi cú pháp tích cực được một chút khó sử dụng, bạn có thể sử dụng các truy vấn SQL đầy đủ và nhận được kết quả tương tự:

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

Cả hai hình thức sẽ đảm bảo rằng dữ liệu của bạn được thoát đúng cách.

CodeIgniter Active Record

Query Binding in CodeIgniter

+0

Bằng cách này tôi sẽ tham gia giữa hai bảng và nhận được tất cả các kết quả phải không? Làm thế nào tôi có thể chỉ định ID từ hàng mà tôi muốn lấy dữ liệu? Nội dung như 'WHERE movies.id = $ id' .. – Jonathan

+0

Tôi đã thêm một số thông tin khác ở trên. :) – GloryFish

+0

Có sự khác biệt về hiệu năng giữa 'Bản ghi hoạt động' và mã SQL điều chỉnh không ??? – Jonathan

4

Dấu sao sẽ trả về tất cả các trường. Để trả về một tập hợp con của các trường này, tức là tất cả các trường ngoài đều tạo thành trường id lặp lại, chỉ cần liệt kê các cột mà bạn yêu cầu thay vì sử dụng '*'.

Thường thì không nên sử dụng dấu hoa thị. Trong tương lai của ứng dụng, ai đó có thể thêm một trường lớn vào bảng sẽ thặng dư yêu cầu của bạn và sẽ làm chậm truy vấn của bạn.

1

một cách đơn giản với phương pháp chaining:

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