2012-05-14 15 views
7

Logicamente in SQL possiamo cancellare i dati dalle tabelle con JOINS, ad es.Codeigniter che cancella i dati con tabelle join

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; 

Quale sarà l'equivalente CodeIgniter della query precedente?

Supporta CodeIgniter Elimina query con join?

risposta

4

Hai per utilizzare Active Records?

Questo sotto query farà diversamente.

$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

Ehi, non voglio usare il metodo query(). Voglio usare $ this-> db-> join(), $ this-> db-> delete() Hai capito? –

4

Non è possibile farlo con la classe Active Record di CodeIgniter. Non supporta i join nella query di eliminazione. Dovrai eseguire la query usando $this->db->query() come menzionato da Robin Castlin.

Il codice seguente è preso dai file principali. È uno dei componenti interni, che genera la query 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; 
} 

Come si può vedere, non c'è niente lì dentro che specifica l'inserimento di una clausola di JOIN.

+2

Sì, ma dovrebbe essere, speriamo che qualcuno da CI stia ascoltando –

+2

Beh, perché non lo porti ai loro forum (http://codeigniter.com/forums/) allora? O forse il loro bug tracker (https://github.com/EllisLab/CodeIgniter/issues)? –

1

Ho avuto lo stesso problema, l'adesione è stata ignorata:

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

così ho fatto in questo modo:

$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

Invece di riscrivere l'intero SQL, si può fare in questo modo:

// 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); 

In questo modo, si mantengono le cose buone da Query Builder (ovvero i record attivi) e si ha la libertà dell'utente anche Penso che sia abbastanza sicuro, poiché la stringa $sql inizierà sempre con DELETE. Ovviamente puoi avvolgerlo in una funzione come scorciatoia.