2014-02-10 1 views
0

Ok, так что я нахожусь в рассоле, пытаясь найти способ для того, как сделать это:CakePHP - SQL запрос Регистрация

У меня есть живой поиск (с помощью Ajax), который позволяет пользователю выбрать критерии из выпадающий список, а затем введите значение, которое будет соответствовать значениям внутри базы данных. Это довольно тривиальный материал, и на прямых полях основной модели у меня нет никаких проблем.

У меня есть донор Модель/таблица, которая состоит из таких атрибутов, как ID, Name, Surname etc, но что более важно, он также имеет FK других связанные модели, такие как blood_group_id, donor_type_id,, отображающие обратно на соответствующие модели (BloodGroup and DonorType) .. Эти два уже установлены с ассоциациями, и я вне этой части, поскольку я уже получаю записи доноров с соответствующими данными модели.

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

public function search() { 
     if($this->request->is('post')){ 
      if(!empty($this->request->data)){ 
       $criteria = $this->request->data['criteria']; 
       $query = $this->request->data['query']; 
       $conditions = array("Donor." .$criteria. " LIKE '". $query . "%'"); 

Вышеописанное проверяет, был ли отправлен запрос на отправку и были ли отправлены данные. Критерии и пользовательский ввод используются для построения запроса.

Здесь возникает моя проблема. (Когда пользователь выбирает поиск по типу крови, в качестве критерия от выпадающего списка), приведенное выше предполагает, что пользователь должен ввести идентификатор blood_group, а не A + или A. Например, если входной сигнал равен 1 (идентификатор группы крови A +), результаты возвращаются, как ожидалось. Но я хочу, чтобы пользователь мог ввести A + ...

Вот остальная часть методы:

$this->Paginator->settings = array(
       'conditions' => $conditions, 
       'limit' => 2 
      ); 


$donors = $this->Paginator->paginate('Donor'); 
      $this->set('donors', $donors); 
      $this->beforeRender(); 
      $this->layout= 'ajax'; 
     } 
    } 
} 

Я попробовал этот подход, создание условий, используя имя модели, такие как

if($criteria == 'blood_group_id'){ 
     $conditions = array("BloodGroup.id" . " LIKE '". $query . "%'"); 
    }elseif($criteria == 'donor_type_id'){ 
     $conditions = array("DonorType.id" . " LIKE '". $query . "%'"); 
    }else{ 
     $this->Paginator->settings = array(
      'conditions' => $conditions, 
      'limit' => 2 
     ); 
    } 

Но это возвращает все записи независимо от ввода.

Я также попытался изменить настройки для постраничной навигации не повезло

$settings = array(
    'joins' => array(
    'table' => 'blood_groups', 
    'alias' => 'BloodGroup', 
    'type' => 'LEFT', 
    'conditions' => array(
     "BloodGroup.id" => "Donor.blood_group_id", 
     "AND" => $conditions 
    ) 
    ), 
'limit'=> 2 
); 

Любая помощь на том, как сделать то, что я объяснил выше, было бы очень признателен!

+0

как вы заполняете свои критерии dropwodn list? – arilia

+0

@arilia жестко запрограммирован так: '' options '=> array ( ' id '=>' By ID ', ' name '=>' By Name ',' blood_group_id '=>' By Blood Type ' , 'type' => 'by Donor Type', 'age' => 'By Age', 'gender' => 'По полу' ) ' – LogixMaster

ответ

1

просто:

if($criteria == 'blood_group_id') 
    $conditions = array("BloodGroup.name LIKE" => $query.'%'); 

(предполагающие bood_types имеет столбец 'имя')

пусть Также я предлагаю вам использовать поисковый плагин CakeDC (https://github.com/CakeDC/search).

+0

Спасибо за указание плагина :) хотя запрос все еще возвращает все записи и не фильтруется. – LogixMaster

+0

, потому что ваш 'if' неверен, и PHP никогда не вводит блок кода Paginator->, если $ criteria == 'block_group_id'. Попробуйте переписать целое, если логика – arilia

+0

OOPS-Ofcourse !! как я пропустил это!Теперь я чувствую себя таким глупым и невежественным, мой плохой! Спасибо за твою помощь !! - извлеченный урок - проверьте весь код, особенно самый тривиальный. иногда я пропускаю эти ошибки SILLY – LogixMaster