2011-12-13 8 views
12

Oryginalna posted na cakephp Q & A, ale ja to tu postawię w nadziei uzyskania odpowiedzi.cakephp LUB stan

Mam kilka firm, które mają status 0 jako domyślne, ale czasami mają wyższy status. Teraz chcę użyć wysokiego statusu, jeśli istnieje, ale w razie potrzeby powrócić do 0. Próbowałem różnych podejść, ale zawsze otrzymałem tylko te o statusie 0 lub te o statusie, które chcę, nigdy nie dając mi statusu, jeśli istnieje i 0, jeśli nie.

Daje mi tylko stan mogę określić, nie dając mi te z stanu 0:

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

    ) 
) 

daje mi statusu tylko 0:

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

definicji statusu i odzyskiwanie danych w kodzie:

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

Zmieniłem nazwę modeli dla tego pytania, aby uzyskać więcej sensu, ludzie Zazwyczaj przestraszyli się, gdy mówię im, że pracuję z cakephp dla mojej elastycznej aplikacji. Myślę, że logika tego pytania nie ma sensu, ale wierz mi, że ma to sens w mojej aplikacji.

Dzięki!

+0

Czy można dołączyć zrzut SQL? (Użyj $ this-> Element ('sql_dump'); w twoim widoku upewnij się, że Configure :: debug> 0). – Oldskool

+0

To przyniesie pracę, ponieważ wywołuję funkcje w ciastku z mojej aplikacji flex. Zapytania nie będą wyświetlane w moim widoku. – eldamar

Odpowiedz

24

nie jestem pewien, że zrozumiał, co skutkuje można oczekiwać . Jeśli chcesz odzyskać wszystkie rekordy o statusie = 0, a powiedzmy, że ma status = 3, możesz użyć "IN" zamiast "OR".

w cieście, należy napisać to tak:

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

Ta odpowiedź bije Vigrondów. Mimo że obie metody działają, użycie IN jest znacznie bardziej wydajne niż użycie OR, dzięki czemu cała aplikacja staje się szybsza. – pudelhund

+0

W przykładzie OP ten może być lepszy, ale w przypadku 'OR' obejmujący więcej niż jedno pole, odpowiedź @ Vigrond działa dla obu przypadków. – dKen

46

Spróbuj

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

    ) 
) 

W książce kucharskiej mówi zawinąć lub warunki w tablicach, jeśli są one odnoszące się do tego samego pola http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

+0

To daje mi taki sam wynik jak mój drugi przykład, wyświetla tylko każdą firmę o statusie = 0 i nie używa zdefiniowanego statusu, jeśli istnieje. – eldamar

+0

Czy możesz pokazać nam, w jaki sposób deklarowany jest status $ i jaki jest przykład wartości w bazie danych? – Vigrond

+0

Zaktualizowałem moje pytanie z dodatkowymi informacjami, czy to pomaga? – eldamar

0

Można również nagrywać pobrać za pomocą następującej metody: wartości umieszczone w tablicy np $ arr = array (1,2);

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

Mam nadzieję, że znajdziesz odpowiedź.