我正在使用CakePHP搜索插件,而且还有一些我无法工作的东西。我想有一个搜索字段(我们称之为年龄),用户可以在其中输入一个值(例如24),并获得所有具有表。我怎么能这样做?
到目前为止,我可以执行正常搜索,例如按名称或精确值(如果您希望年龄24 完全,那么它可以正常工作)。
以下是我到目前为止与搜索插件相关的代码:
- 型号:
class Person extends AppModel{
var $name = 'Person';
public $actsAs = array('Searchable');
public $filterArgs = array(
array('name' => 'name', 'type' => 'like'),
array('name' => 'age', 'type' => 'value'),
);
}
- 控制器:
class PersonsController extends AppController {
var $name = 'Persons';
var $components = array('Search.Prg');
public $presetVars = array(
array('field' => 'name', 'type' => 'value'),
array('field' => 'age', 'type' => 'value'),
);
function index() {
$this->set('persons', $this->Person->find('all'));
}
/* ---------------- SEARCH PLUGIN --------------*/
public function find() {
$this->Prg->commonProcess();
$this->paginate['conditions'] = this->Game->parseCriteria($this->passedArgs);
$this->set('persons', $this->paginate());
}
}
- find.ctp:
//apart from the code below, I have all the code to show the results
echo $form->create('Game', array(
'url' => array_merge(array('action' => 'find'), $this->params['pass'])
));
echo $form->input('name', array('div' => false));
echo $form->input('age', array('div' => false));
echo $form->submit(__('Search', true), array('div' => false));
echo $form->end();
总结一下:,使用上面的代码,我可以搜索年龄字段的确切值。如何更改以执行搜索'age> = 输入的值'?
提前感谢你!
答案 0 :(得分:1)
所以这就是我解决它的方式(至少它似乎适用于迄今为止所做的所有测试):
更改了'年龄'在模型中 filterArgs 数组中的以下行:
array('name' => 'age', 'type' => 'query', 'method' => 'findByAge', 'field' => 'Person.age'),
在同一模型中添加了以下方法:
public function findByAge($data = array()) {
$query = array(
'Person.age >=' => $data['age'],
);
return $query;
}
那就是它!使用'查询'类型,可以使用方法将任何复杂查询添加到主查询中。感谢satyrwilder指向正确的方向!
答案 1 :(得分:0)
来自您的presetVars -
array('field' => 'age', 'type' => 'value'),
- 从你的commonProcess()方法过滤到你的find()方法,我认为这构造了一个通用的find,如conditions => array($ key => $ val)?
Cake看到array key => val对赋值作为生成“WHERE $ key = $ val”条件的指示。
要做一个更模糊的拉动,无论你在哪里构造那个泛型的find() - 添加一个方法或者其他东西只是为了将这两个转化为
'conditions'=>array("name LIKE '%{$name}%'", "{$age}>={$val}")
或者你发生的任何事情。将参数串在一起以获得对查询的预期效果,并且我确信如果需要,您可以推断出抽象查询的其他方法。
如果你需要一个更复杂的解决方案, Cake提供了优雅的内置,极其强大的子查询生成。你似乎很难实现很多内置功能,但是然后我再也不知道你的情况有多复杂。
http://book.cakephp.org/view/1030/Complex-Find-Conditions
HTH
答案 2 :(得分:0)
我知道这已经得到了回答,但还有另一种方法可能更适合这种情况。
来自文档
'expression'类型:如果您想添加将通过某种方法生成的条件,并且条件字段包含几个参数,例如用于'range'的previos样本,则非常有用。这里的字段包含'Article.views BETWEEN?和?'和Article :: makeRangeCondition返回两个值的数组。
我必须完成你所做的同样的事情,但有5个不同的领域。我不想为每个人写一个查询。这是我用表达式类型完成同样的事情的方法。这是在filterArgs数组中。
array(
'name'=>'bathrooms',
'type'=>'expression',
'method'=>'returnNumber',
'field'=>'House.bathrooms >= ?'
)
然后我在模型中创建了这个函数,它只返回用户提交的数字。调用时,returnNumber将传递两个数组。
看起来像这样。
Array
(
[0] => Array
(
[bathrooms] => 6
[bedrooms] => 5
[acres] => 12
[city] => Greenville
[year] => 2009
)
[1] => Array
(
[name] => bathrooms
[type] => expression
[method] => returnNumber
[field] => House.bathrooms >= ?
)
)
现在为实际功能。您可以使用debug语句查看实际传递函数的内容。
function returnNumber($arg, $name){
// debug(func_get_args());
// exit;
return $arg[$name['name']];
}