2011-12-13 2 views
12

Originaly posted sur cakephp Q & A mais je vais le mettre en place ici dans l'espoir d'obtenir des réponses.cakephp OU condition

J'ai un groupe d'entreprises qui a un statut de 0 par défaut mais qui obtient parfois un statut supérieur. Maintenant, je veux utiliser le statut élevé s'il existe mais revenir à 0 sinon. J'ai essayé un tas d'approches différentes mais je reçois toujours soit seulement celles avec le statut 0 ou celles avec le statut que je veux, ne me donnant jamais le statut si existe et 0 sinon.

ne me donne que le statut je précise, ne me donne pas ceux avec le statut 0:

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

    ) 
) 

me donne seulement l'état 0:

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

définition d'état et de récupération des données dans le code:

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

J'ai changé le nom des modèles pour cette question juste pour avoir plus de sens, peopl Je suis généralement effrayé quand je leur dis que je travaille avec cakephp pour mon application flexible. Je suppose que la logique de cette question n'a pas de sens, mais croyez-moi que cela a du sens dans mon application.

Merci!

+0

Pouvez-vous joindre un vidage SQL? (Utilisez $ this-> Element ('sql_dump'), à votre avis, en vous assurant que Configure :: debug> 0). – Oldskool

+0

Cela ne fonctionnera pas puisque j'appelle des fonctions dans le gâteau à partir de mon application flexible. Les requêtes ne s'afficheront pas sur ma vue. – eldamar

Répondre

24

Je ne suis pas sûr d'avoir compris ce que les résultats que vous attendez . Si vous voulez récupérer tous les enregistrements ayant le statut = 0, plus disons celui ayant le statut = 3, vous pouvez utiliser un 'IN' au lieu d'un 'OU'.

Dans Cake, vous l'écrire comme ceci:

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

Cette réponse bat Vigronds. Bien que les deux méthodes fonctionnent, l'utilisation de IN est beaucoup plus efficace que l'utilisation de OU et donc l'application entière devient plus rapide. – pudelhund

+0

Dans l'exemple d'OP, celui-ci peut être meilleur, mais dans le cas d'un 'OU' couvrant plus d'un champ, la réponse de @ Vigrond fonctionne dans les deux cas. – dKen

46

Essayez

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

    ) 
) 

Dans le livre de cuisine, il dit envelopper la ou les conditions dans les tableaux si elles sont appartenant au même domaine http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

+0

Cela me donne le même résultat que mon deuxième exemple, seulement afficher chaque société avec status = 0 et ne pas utiliser le statut défini si elles existent. – eldamar

+0

Pouvez-vous nous montrer comment $ status est déclaré, et un exemple de ce que sont les valeurs dans la base de données? – Vigrond

+0

Mis à jour ma question avec des informations supplémentaires, est-ce que cela aide? – eldamar

0

Vous pouvez également chercher enregistrement à l'aide méthode suivante: valeurs de vente dans un tableau par exemple $ arr = array (1,2);

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

J'espère que vous trouverez la réponse.