【问题标题】:CakePHP Search Plugin, search for a value equal or higher than the given in the searchCakePHP Search Plugin,搜索等于或大于搜索中给定的值
【发布时间】:2011-06-20 22:41:14
【问题描述】:

我正在使用 CakePHP 搜索插件,但有些东西我无法工作。我想有一个搜索字段(我们称之为 age),用户可以在其中输入一个值(例如 24)并获得所有在 中具有值的元素>age 表中年龄为 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 字段的确切值。如何更改它以执行“年龄 >= 输入值”的搜索?

非常感谢您!

【问题讨论】:

    标签: search cakephp plugins


    【解决方案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 指出了正确的方向!

    【讨论】:

    • O_o YW :) 现在,不要误会我的意思,我和下一个开发者一样喜欢漂亮的小抽象。也许我错过了一些东西。你为什么不直接使用 Cake 的魔法 findBy?无需显式定义 findByWhatever('field') - 只需调用它即可。当您滚动 findByWhatever 时,Cake 的 Model 类滚动一个动态方法,获取“whatever”,在 Model 内部查找字段,并返回第一个。 (你猜不到 findAllByWhatever 有什么不同...^_^) findBy() / findAllBy() 不支持等于或大于比较吗?
    【解决方案2】:

    从你的 presetVars -

    array('field' => 'age', 'type' => 'value'),
    

    -- 从您的 commonProcess() 方法过滤到您的 find() 方法,我认为它构造了一个通用的 find,如条件 =>array($key=>$val)?

    Cake 将数组 key=>val 对分配视为生成“WHERE $key=$val”条件的指示。

    要做一个更模糊的拉取,无论你在哪里构造通用的 find() - 添加一个方法或其他东西只是为了将这两个滚动到

    'conditions'=>array("name LIKE '%{$name}%'", "{$age}>={$val}")
    

    或任何你正在做的事情。将参数串在一起以获得对查询的预期效果,我相信如果需要,您可以推断出进一步抽象该查询的方法。

    如果您需要更复杂的解决方案,Cake 提供了优雅的内置、极其强大的子查询生成功能。 看起来您正在非常努力地实现很多内置功能,但是再说一次,我不知道你的情况有多复杂。

    http://book.cakephp.org/view/1030/Complex-Find-Conditions

    HTH

    【讨论】:

    • 谢谢satyrwilder,我去看看!
    【解决方案3】:

    我知道这已得到解答,但还有另一种方法可能更适合这种情况。

    来自文档

    '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 >= ?
            )
    
    )
    

    现在是实际功能。您可以使用调试语句来查看您实际传递的函数。

    function returnNumber($arg, $name){
        // debug(func_get_args());
        // exit;
        return $arg[$name['name']];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多