好的,所以我正在尝试为如何做到这一点找到方法:
我有一个实时搜索(使用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
);
如何完成我上面解释的任何帮助,将不胜感激!
答案 0 :(得分:1)
简单地:
if($criteria == 'blood_group_id')
$conditions = array("BloodGroup.name LIKE" => $query.'%');
(假设bood_types有一个'name'列)
另外,我建议您使用CakeDC搜索插件(https://github.com/CakeDC/search)。