CakePHP Пагинация с помощью find () и сложного запроса - PullRequest
1 голос
/ 31 января 2011

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

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

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

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

Самый близкий я (который не выдавал ошибки SQL) выполнил

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

ПРИМЕЧАНИЕ: $ options - это фактические соединения и условия поискового запроса (и запрос работает без пагинации).

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

Использование нумерации страниц для моих нужд кажется очень сложным с 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'));
}

1 Ответ

4 голосов
/ 31 января 2011

При условии, что ваша $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'));
...