2011-01-31 3 views
1

Я уже несколько часов взламываю это. Читайте о 7 или 8 онлайн-уроках, и я по-прежнему не могу заставить свою разбивку по страницам работать со своими результатами поиска.CakePHP Пагинация с поиском() и сложным запросом

Вот основы ситуации:

В моей plans_controller, я называю это в моей функции поиска запроса

 $this->set('plans', $this->Plan->find('all', $options)); 

Ближайший я пришел (не кидал ошибок SQL), выполнив

$this->set('plans', $this->Plan->find('all', $options), $this->paginate()); 

Примечание: $ опции фактический поисковый запрос включается и условия (и запрос работает отлично ж /).

Но вышеизложенное ничего не предприняло, чтобы нести поисковый запрос на следующие страницы и даже не работало с первым набором результатов поиска.

Использование pagination для моих нужд кажется очень сложным с CakePHP, но с этой нитью я надеюсь на более округленное объяснение, где я должен начать это делать (и любой другой простой, но эффективный совет приветствуется :)).

Это мой первый раз, пытаясь использовать этот тип сложной разбивки на страницы.

Вот мой код контроллера. Вы увидите, что большая часть этого неприменима, но все еще пытается решить эту проблему .:

var $name = 'Plans'; 

function beforeFilter() { 
    $this->Auth->allow('search','index'); } 

function search() { 

    $this->Plan->recursive = 2; 

    if(isset($this->data['Plan']['ApplicantAge'])) { 
     $ApplicantAge = $this->data['Plan']['ApplicantAge']; 
    } else { 
     $ApplicantAge = 25; 
    } 
    if(isset($this->data['Plan']['SpouseAge'])) { 
     $SpouseAge = $this->data['Plan']['SpouseAge']; 
    } else { 
     $SpouseAge = 0; 
    } 
    if(isset($this->data['Plan']['NumberChildren'])) { 
     $NumberChildren = $this->data['Plan']['NumberChildren']; 
    } else { 
     $NumberChildren = 0; 
    } 
    if(isset($this->data['Plan']['Vision'])) { 
     $Vision = $this->data['Plan']['Vision']; 
    } else { 
     $Vision = 0; 
    } 
    if(isset($this->data['Plan']['ZipCode'])) { 
     $Zip = $this->data['Plan']['ZipCode']; 
    } else { 
     $Zip = 0; 
    } 

    $memberCount = 1; //We can assume the applicant is there 
    if($SpouseAge > 0) { 
     $memberCount += 1; 
    } 
    if($NumberChildren > 0) { 
     $memberCount += $NumberChildren; 
    } 

    //2: Combo plan (1 adult + children, 1 adult + spouse + children) 
    $comboType = 'sa'; 
    if($ApplicantAge < 18) { 

     //$comboType = 'sc'; 
    } 
    if($SpouseAge > 0) { 
     if($NumberChildren > 0) { 
      $comboType = 'asc'; 
     } else { 
      $comboType = 'as'; 
     } 
    } else { 
     if($NumberChildren > 0) { 
      $comboType = 'ac'; 
     } 
    } 


     $options = array(
     'joins' => array (
      array( 
       'table' => 'plans_zips', 
       'alias' => 'PZips', 
       'type' => 'inner', 
       'foreignKey' => false, 
       'conditions'=> array('Plan.id = PZips.plan_id') 
      ), 
      array( 
       'table' => 'zips', 
       'alias' => 'Zips', 
       'type' => 'inner', 
       'foreignKey' => false, 
       'conditions'=> array('Zips.id = PZips.zip_id') 
      ) 
     ), 
     'conditions' => array(
      "AND" => array(
       array($ApplicantAge . ' BETWEEN Age.Min_Age AND Age.Max_age'), 
       'Zips.title' => $Zip, 
       'Applicant.amount' => array($comboType, $memberCount), 
       'PlanDetail.active' => 1) 
     ) 
    ); 

    $queryStr = "SELECT Plan.* FROM plans AS Plan "; 
    $queryStr = $queryStr . "INNER JOIN ages on age_id = ages.id "; 
    $queryStr = $queryStr . "INNER JOIN applicants on applicant_id = applicants.id "; 
    $queryStr = $queryStr . "WHERE (applicants.amount = '". $memberCount . "' OR applicants.amount = '" . $comboType . "')"; 
    $queryStr = $queryStr . " AND (". $ApplicantAge . " BETWEEN ages.Min_Age+0 AND ages.Max_Age+0) "; 
    $queryStr = $queryStr . " AND Plan.id IN (SELECT plan_id FROM plans_zips where zip_id = (SELECT id FROM zips WHERE title = '". $Zip. "'))"; 
    //Add the vision limiting item 
    if($Vision == 1) { 
     $queryStr = $queryStr . " AND dental_cost > 0"; 
     array_push($options['conditions'], "dental_cost > 0"); 
    } 

    //$this->set('plans', $this->Plan->find('all', $options)); 

    $this->paginate = $options; 
    $plans = $this->paginate(); 
    $this->set(compact('plans')); 
} 

ответ

4

Предполагая ваш $options переменная содержит обычный массив параметров запроса, все, что вам нужно сделать, это заменить на нормальный find вызов с paginate вызова:

$options = array('conditions' => ...); 

// normal find call 
// $plans = $this->Plan->find('all', $options); 

// same thing with pagination: 
$this->paginate = $options; 
$plans = $this->paginate(); 

$this->set(compact('plans')); 
+0

Привет Deceze, я не уверен, что если бы вы рассмотреть мой запрос (размещен выше) «нормальный массив». Я бы сказал, что это не нормально:). Я попробовал ваше предложение, и он работает неправильно. Я начинаю смотреть на это и думать: 1) Лучше всего передать параметры через URL-адрес, а затем 2) сохранить параметры поиска в URL-адресе, чтобы страницы были разбиты на страницы, поиск остается на страницах. НО мне нужно убедиться, что результаты NEW, поскольку страницы разбиты на страницы Далее >> например .. Это очень сложно! – OldWest

+0

@Old Что поразило меня в вашем исходном коде, было просто, что вы использовали '$ this-> paginate()' wrong. Я не могу прокомментировать, должен ли работать текущий код. Может быть, вы могли бы уточнить, каковы конкретные осложнения? – deceze

+0

Я, вероятно, делаю это более запутанным, что это должно быть. В принципе, я не уверен, как подойти к этому, чтобы заставить его работать. Мне нужно иметь возможность разбивать мои результаты поиска на 5 записей на страницу и поддерживать запрос при изменении страниц (Prev или Next). Данные поиска также должны быть уникальными для каждой страницы - другими словами, дублировать результаты. Это то, чего я пытаюсь достичь, но я просто не знаю, с чего начать, или как лучше всего подходит к этому. Спасибо за любые дополнительные советы:) – OldWest

Смежные вопросы