2012-05-14 48 views
7

Về mặt logic trong SQL, chúng tôi có thể xóa dữ liệu khỏi các bảng bằng JOINS ví dụ:Codeigniter xóa dữ liệu với các bảng tham gia

DELETE clb_subscriber_group_mapping .* FROM clb_subscriber_group_mapping 
INNER JOIN clb_driver_group ON (clb_driver_group.id = clb_subscriber_group_mapping.driver_group_id) 
INNER JOIN clb_company ON (clb_company.id = clb_driver_group.company_id) 
WHERE clb_company.id = 256 AND clb_subscriber_group_mapping.subscriber_id = 1784; 

CodeIgniter tương đương với truy vấn trên là gì?

CodeIgniter có hỗ trợ Xóa truy vấn có tham gia không?

Trả lời

4

Bạn có để sử dụng Active Records?

Điều này dưới đây query sẽ làm khác.

$int_company_id = 256; 
$int_subscriber_id = 1784; 

$this->db->query(" 
DELETE clb_subscriber_group_mapping .* FROM clb_subscriber_group_mapping 
INNER JOIN clb_driver_group ON (clb_driver_group.id = clb_subscriber_group_mapping.driver_group_id) 
INNER JOIN clb_company ON (clb_company.id = clb_driver_group.company_id) 
WHERE clb_company.id = ? AND clb_subscriber_group_mapping.subscriber_id = ?; 

", array($int_company_id, $int_subscriber_id)); 
+1

Hey Tôi không muốn sử dụng phương thức query(). Tôi muốn sử dụng $ this-> db-> join(), $ this-> db-> delete() Có quan điểm của tôi không? –

4

Bạn không thể làm điều đó với lớp Active Record của CodeIgniter. Nó không hỗ trợ kết nối trong truy vấn xóa. Bạn sẽ phải thực hiện truy vấn bằng cách sử dụng $this->db->query() như đã đề cập bởi Robin Castlin.

Mã dưới đây được lấy từ các tệp lõi. Nó là một trong các thành phần bên trong, tạo ra truy vấn DELETE.

function _delete($table, $where = array(), $like = array(), $limit = FALSE) 
{ 
    $conditions = ''; 

    if (count($where) > 0 OR count($like) > 0) 
    { 
     $conditions = "\nWHERE "; 
     $conditions .= implode("\n", $this->ar_where); 

     if (count($where) > 0 && count($like) > 0) 
     { 
      $conditions .= " AND "; 
     } 
     $conditions .= implode("\n", $like); 
    } 

    $limit = (! $limit) ? '' : ' LIMIT '.$limit; 

    return "DELETE FROM ".$table.$conditions.$limit; 
} 

Như bạn có thể thấy, không có gì trong đó chỉ định việc chèn mệnh đề JOIN.

+2

Có, nhưng nó nên được, Hy vọng rằng một người nào đó từ CI đang nghe –

+2

Vâng tại sao bạn không mang nó đến diễn đàn của họ (http://codeigniter.com/forums/) sau đó? Hoặc, có lẽ trình theo dõi lỗi của họ (https://github.com/EllisLab/CodeIgniter/issues)? –

1

tôi đã cùng một vấn đề, các join đã bị bỏ qua:

$r1 = $db->where("object2_type", $object_type) 
->join($object_type, "$object_type.id = object1_id", "LEFT") 
->where("$object_type.id IS NULL", null, false) 
->delete("knots"); 

vì vậy tôi đã làm nó như thế này:

$ids = $db->select("knots.id") 
->where("object2_type", $object_type) 
->join($object_type, "$object_type.id = object1_id", "LEFT") 
->where("$object_type.id IS NULL", null, false) 
->get("knots")->result_object(); 
/* my ow function which generates a string like '1','2','3' or 0 */  
$ids_csv = $this->mh()->get_flat_items_as_csv($ids); 
$r = $db->where("knots.id IN ($ids_csv)", null, false)->delete("knots); 
1

Thay vì viết lại toàn bộ SQL, Bạn có thể làm như thế này:

// build query as usual... 
$this->db 
    ->from ('cookies') 
    ->join ('recipes', 'recipes.cookie = cookies.id') 
    ->where ('recipes.rating', 'BAD'); 

/* 
* get the original DELETE SQL, in our case: 
* "DELETE FROM `cookies` JOIN `recipes` ON `recipes`.`cookie`=`cookies`.`id` WHERE `recipes`.`rating`='BAD'" 
*/ 
$sql = $this->db->get_compiled_delete ('cookies'); 

/* 
* insert the target table in the SQL string, to get this: 
* "DELETE `cookies` FROM `cookies` JOIN `recipes` ON `recipes`.`cookie`=`cookies`.`id` WHERE `recipes`.`rating`='BAD'" 
*/ 
$target = $this->db->escape_identifiers ('cookies'); // just to be safe 
$sql = substr_replace ($sql, " $target", 6, 0); // note the prepended space 

// now we can run the query 
$q = $this->db->query ($sql); 

Bằng cách này, bạn giữ nội dung tốt từ Trình tạo truy vấn (còn gọi là Hồ sơ hoạt động) và có quyền tự do tùy chỉnh của bạn ization là tốt. Tôi nghĩ, nó khá an toàn, vì chuỗi $sql sẽ luôn bắt đầu với DELETE. Bạn có thể bọc nó vào một hàm như một phím tắt, tất nhiên.

Các vấn đề liên quan