CakePHP搜索插件,搜索等于或高于搜索中给定值的值

时间:2011-06-20 22:41:15

标签: search cakephp plugins

我正在使用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> = 输入的值'?

提前感谢你!

3 个答案:

答案 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返回两个值的数组。

Full Article Here

我必须完成你所做的同样的事情,但有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']];
}