2012-05-14 18 views
7

Logisch in SQL können wir Daten aus Tabellen mit JOINS z.Codeigniter Löschen von Daten mit Joins Tabellen

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; 

Wie wird das CodeIgniter-Äquivalent der obigen Abfrage sein?

Unterstützt CodeIgniter Abfrage mit Joins löschen?

Antwort

4

Haben Sie Active Records verwenden?

Dies unter query wird sonst tun.

$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 Ich möchte nicht die Methode query() verwenden. Ich möchte verwenden $ this-> db-> join(), $ this-> db-> löschen() Got my point? –

4

Sie können dies nicht mit CodeIgniter Active Record-Klasse tun. Es unterstützt keine Joins in der Löschabfrage. Sie müssen die Abfrage mit $this->db->query() wie von Robin Castlin erwähnt ausführen.

Der folgende Code wird aus den Kerndateien übernommen. Es ist eine der inneren Komponenten, die die Abfrage DELETE generiert.

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

Wie Sie sehen können, gibt es nichts drin, die das Einsetzen einer JOIN Klausel gibt.

+2

Ja, aber es sollte sein, Hoffentlich hört jemand von CI zu. –

+2

Nun, warum nimmst du es nicht in ihre Foren (http://codeigniter.com/forums/)? Oder vielleicht ihr Bug-Tracker (https://github.com/EllisLab/CodeIgniter/issues)? –

1

ich hatte das gleiche Problem, verbinden sie die ignoriert wurde:

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

so habe ich es so:

$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

Statt die gesamte SQL neu zu schreiben, können Sie wie folgt tun:

Auf diese Weise halten Sie die guten Sachen von Query Builder (aka Active Records) und haben Ihre Freiheit der Gewohnheit ierung auch. Ich denke, es ist ziemlich sicher, da der $sql String immer mit DELETE beginnt. Sie können dies natürlich als Verknüpfung in eine Funktion einfügen.

Verwandte Themen