2011-12-13 15 views
12

Originaly posted on cakephp Q & A ma lo metterò qui nella speranza di ottenere delle risposte.cakephp OR condition

Ho un gruppo di aziende che ha uno stato di 0 come impostazione predefinita ma a volte ottiene uno stato più elevato. Ora voglio usare lo stato alto se esiste ma tornare a 0 se non lo è. Ho provato un sacco di approcci diversi ma ottengo sempre solo quelli con lo stato 0 o quelli con lo stato che voglio, mai dandomi lo stato se esiste e 0 se non.

mi dà solo lo stato a specificare, non mi dà quelle con stato 0:

'Company' => array (
    'conditions' => array (
     'OR' => array(
      'Company.status' => 0, 
      'Company.status' => $status, 
     ) 

    ) 
) 

mi dà solo status di 0:

'Company' => array (
    'conditions' => array (
     'OR' => array(
      'Company.status' => $status, 
      'Company.status' => 0 
     ) 
    ) 
) 

definizione di stato e di recupero dei dati in codice:

function getCountry($id = null, $status = null) { 
    // Bunch of code for retrieving country with $id and all it's companies etc, all with status 0. 
    $status_less_companies = $this->Country->find... 

    if ($status) { 
     $status_companies = $this->Country->find('first', array(
      'conditions' => array(
       'Country.id' => $id 
      ), 
      'contain' => array(
       'Product' => array (
        'Company' => array (
         'conditions' => array (
          'OR' => array(
           'Company.status' => $status, 
           'Company.status' => 0 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    } 

    // Mergin $status_less_companies and $status_companies and returning data to flex application. 
} 

Ho cambiato il nome per i modelli per questa domanda solo per avere più senso, peopl Sono generalmente spaventati quando dico loro che lavoro con cakephp per la mia applicazione flex. Immagino che la logica di questa domanda non abbia senso, ma fidati di me che abbia senso nella mia applicazione.

Grazie!

+0

È possibile allegare un dump SQL? (Usa $ this-> Element ('sql_dump'); nella tua vista, assicurati di Configure :: debug> 0). – Oldskool

+0

Questo non funzionerà poiché sto chiamando le funzioni in torta dall'interno della mia applicazione flex. Le query non verranno visualizzate sulla mia vista. – eldamar

risposta

24

non sono sicuro di aver capito quali risultati vi aspettate . Se vuoi recuperare tutti i record con stato = 0, più diciamo che con stato = 3, potresti usare un 'IN' invece di un 'OR'.

In Cake, si può scrivere in questo modo:

$status = 3; 
$conditions = array('Company.status' => array(0, $status)); 
+0

Questa risposta batte Vigronds. Sebbene entrambi i metodi funzionino, l'utilizzo di IN è molto più efficiente rispetto all'utilizzo di OR e quindi l'intera applicazione diventa più veloce. – pudelhund

+0

Nell'esempio OP questo può essere migliore, ma nel caso di un 'OR' che occupa più di un campo, la risposta di @ Vigrond funziona in entrambi i casi. – dKen

46

Prova

'Company' => array (
    'conditions' => array (
     'OR' => array(
      array('Company.status' => 0), 
      array('Company.status' => $status), 
     ) 

    ) 
) 

Nel libro di cucina si dice per avvolgere la o le condizioni in matrici se sono appartenenti allo stesso campo http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

+0

Questo mi dà lo stesso risultato del mio secondo esempio, visualizza solo ogni azienda con stato = 0 e non utilizza lo stato definito se esiste. – eldamar

+0

Puoi mostrarci come viene dichiarato $ status e un esempio di quali valori sono presenti nel database? – Vigrond

+0

Aggiornato la mia domanda con alcune informazioni aggiuntive, questo aiuto? – eldamar

0

Potete anche prendere record utilizzando il metodo seguente: valori put in un array esempio $ Arr = array (1,2);

$res = $this->Model->find('all', array(      
     'conditions' =>array('Model.filedname'=>$arr), 
     'model.id' => 'desc' 
)); 

Spero che troverai la risposta.