2014-02-10 165 views
0

好了,我是在泡菜试图找出如何做到这一点的方式:CakePHP的 - SQL查询加入

我有一个实时搜索(使用AJAX),它允许用户从选择标准一个下拉列表,然后输入一个值,该值将与数据库中的值匹配。这是相当平凡的东西,在主模型的直接领域,我没有任何问题。

我有一个供体模型/表它由属性,诸如ID, Name, Surname etc的,但更重要的是它也有其他相关联的模型如blood_group_id, donor_type_id,其映射回相应的模型(BloodGroup and DonorType)..这两个已经被设定的FK与协会和我超出了这一部分,因为我已经检索与相关模型数据的捐助者记录。

下面是搜索方法,希望能帮助你理解我的问题更好。

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的id,而不是A +或A-。因此,如果输入是1(血型A +的ID),则结果按预期返回。但我希望用户能够进入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列表? – arilia

+0

@arilia它被硬编码如下:''options'=> array( 'id'=>'按ID', 'name'=>'按姓名', 'blood_group_id'=>'按血型分类' , 'type'=>'按捐助者类型', '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

因为如果$ criteria =='block_group_id',您的'if'错误并且PHP从不进入Paginator->设置代码块。尝试并重写整个逻辑 – arilia

+0

OOPS-当然!我怎么错过了!我现在觉得很愚蠢和无知,我的坏!谢谢你的帮助 !! - 经验教训 - 检查所有代码,特别是最微不足道的代码。有时我会忽略这些SILLY错误 – LogixMaster