CakePHP - SQL查询加入

时间:2014-02-10 11:47:25

标签: php mysql sql cakephp cakephp-2.3

好的,所以我正在尝试为如何做到这一点找到方法:

我有一个实时搜索(使用ajax),允许用户从下拉列表中选择一个条件,然后输入一个与数据库内的值匹配的值。这是非常微不足道的东西,在主模型的直接领域,我没有任何问题。

我有一个捐赠者模型/表格,其中包含ID, Name, Surname etc等属性,但更重要的是,它还有FK其他相关模型,例如blood_group_id, donor_type_id,,它们会映射回相应的models(BloodGroup and DonorType)..这两个已经设置了关联,我超出了那个部分,因为我已经检索了具有相关模型数据的Donor记录。

这是一种搜索方法,可以帮助您更好地理解我的问题。

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';
        } 
    }
}

我尝试过这种方法,使用Model的名称设置条件,例如

   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
);

如何完成我上面解释的任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:1)

简单地:

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

(假设bood_types有一个'name'列)

另外,我建议您使用CakeDC搜索插件(https://github.com/CakeDC/search)。