Я уже несколько часов взламываю это. Читайте о 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'));
}
Привет Deceze, я не уверен, что если бы вы рассмотреть мой запрос (размещен выше) «нормальный массив». Я бы сказал, что это не нормально:). Я попробовал ваше предложение, и он работает неправильно. Я начинаю смотреть на это и думать: 1) Лучше всего передать параметры через URL-адрес, а затем 2) сохранить параметры поиска в URL-адресе, чтобы страницы были разбиты на страницы, поиск остается на страницах. НО мне нужно убедиться, что результаты NEW, поскольку страницы разбиты на страницы Далее >> например .. Это очень сложно! – OldWest
@Old Что поразило меня в вашем исходном коде, было просто, что вы использовали '$ this-> paginate()' wrong. Я не могу прокомментировать, должен ли работать текущий код. Может быть, вы могли бы уточнить, каковы конкретные осложнения? – deceze
Я, вероятно, делаю это более запутанным, что это должно быть. В принципе, я не уверен, как подойти к этому, чтобы заставить его работать. Мне нужно иметь возможность разбивать мои результаты поиска на 5 записей на страницу и поддерживать запрос при изменении страниц (Prev или Next). Данные поиска также должны быть уникальными для каждой страницы - другими словами, дублировать результаты. Это то, чего я пытаюсь достичь, но я просто не знаю, с чего начать, или как лучше всего подходит к этому. Спасибо за любые дополнительные советы:) – OldWest