2012-11-18 9 views
6

Ho una domanda sulle condizioni di esso al di sotto (meno selezionare, da, ecc)Codeigniter DB query con cui, o, e .. e come

$this->db->where('show_year', $yyyy); 
$this->db->or_where('idn', $idn); 
$this->db->or_like('post_slug', $idn); 

che forma

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
OR `idn` = 'the' 
AND `post_slug` LIKE '%the%' 

Tuttavia sto cercando di farlo essere più simile

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
AND (`idn` = 'the' OR `post_slug` LIKE '%the%') 

il mio problema è Im non sicuro se record attivo di CI supporta questa nozione, e se lo fa, come sarebbe Lo affronterò, dato che non riesco a trovarlo da nessuna parte nei documenti. Non importa come cambio lo like, or_like, where, or_where Non riesco nemmeno a inchiodare qualcosa di simile. Quindi qualcuno ha qualche idea? Preferirei stare lontano da una query grezza, se possibile, ma se dovessi prepararne uno e farlo in quel modo, preferirei non farlo.

+0

Penso che questa risposta potrebbe aiutare, http://stackoverflow.com/questions/11937867/nested-where-clauses-codeigniter-mysql- query/11940789 # 11940789 basta lanciare la parte '(...)' all'interno di una '$ this-> db-> dove()' chiama come stringa (con '()' s) – complex857

+0

Penso che potresti essere su a qualcosa con quello. Speravo che ci fosse un modo per farla rimanere suddivisa in parti per renderlo più facile da cambiare nel tempo come è raffinato, e correre lungo la linea che costruisce l'intera query nella sua interezza attraverso condizioni casuali ma se questo è l'unico caso Lo prendo, buon ritrovamento – chris

risposta

2

Hai provato questo?

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' AND `idn` = 'the' 
OR `show_year`='2009' AND `post_slug` LIKE '%the%' 

Penso che la seguente produce espressione di cui sopra:

$this->db->select(...)->from(...)-> 
where("show_year","2009")->where("idn","the")-> 
or_where("show_year","2009")->like("post_slug","%the%") 
+1

La miscelazione di 'AND' e' OR' senza parentesi è probabilmente una cattiva idea da un punto di vista di leggibilità/manutenibilità anche se la distributività funziona come previsto ora. Meglio giocare sul sicuro e usare le clausole [DNF] (http://en.wikipedia.org/wiki/Disjunctive_normal_form) o [CNF] (http://en.wikipedia.org/wiki/Conjunctive_normal_form). – complex857

+0

Lo so ma con AR di CI non posso fare parentesi. È solo una (brutta) soluzione alternativa. Controlla le preferenze dell'operatore in mysql: http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html - mysql evoca prima 'AND' dopo' OR'. – uzsolt

Problemi correlati