2010-01-18 4 views
2

Je cetteChangement de sql cru à codeigniters classe active

SELECT * 
FROM categoryTable 
WHERE categoryId NOT 
IN (

SELECT categoryId 
FROM userMenuTable 
WHERE cookieId = 'bang4b544417a41b6' 
) 

mais je voudrais l'utiliser codeigniters classe record actif si l'aide

$this->db 
syntaxe

, j'espérais que quelqu'un me aider à convertir ce?

Répondre

6

Deux façons de le faire:

ordinaire SQL:

$this->db->query('SELECT * FROM categoryTable WHERE categoryId NOT IN (
    SELECT categoryId FROM userMenuTable WHERE cookieId = "bang4b544417a41b6" 
)'); 

active Enregistrement + plaine où SQL

$this->db->where('categoryId', 'NOT IN (
    SELECT categoryId FROM userMenuTable WHERE cookieId = "bang4b544417a41b6" 
)', FALSE); 

$this->db->get('categoryTable'); 

Vous pouvez mettre Plaine SQL dans une clause WHERE en ajoutant FALSE comme troisième argument dans db-> where();

Il est dommage qu'il n'y ait rien pour faire plus propre, mais Active Record est uniquement destiné à des requêtes simples avec des jointures, des commandes, des limites, etc.

+0

Merci Phil, je viens parti avec RAW sql pour l'instant, réponse très appréciée, bat "It is not possible". – Udders

0

Ce n'est pas possible. L'implémentation CodeIgniter ActiveRecord ne prend pas en charge les requêtes imbriquées.

+0

sadtrombone.com – Matt

1
$this->db->select('categoryId'); 
$this->db->where('cookieId','bang4b544417a41b6'); 
$this->db->from('userMenuTable'); 
$in_query = $this->db->_compile_select(); 
$this->db->_reset_select(); // dont forget this! 

$this->db->select('field1, field2, field3'); // its a best practice not to use * 
$this->db->from('categoryTable'); 

// look at the 3rd param, if you set it to FALSE, CodeIgniter will not try to protect your field or table names with backticks 
$this->db->where("categoryId NOT IN ($in_query)", NULL, FALSE); 

$query = $this->db->get(); 
$result = $query->result(); 
$query->free_result(); // optional, used when there are many queries 
+0

génial, cela aide vraiment –

Questions connexes