2011-06-20 98 views
0

我正在使用CakePHP搜索插件,並且有些事情我無法工作。我希望有一個搜索字段(我們稱之爲年齡),用戶可以在其中輸入一個值(例如24),並獲取表中所有年齡段字段中的值誰是24歲或更高。我怎樣才能做到這一點?CakePHP搜索插件,搜索等於或高於搜索中給定的值

到目前爲止,我可以通過名稱或一個確切的數值進行正常搜索,像(如果你想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()); 
} 
} 

- 找到。 ctp:

與代碼上面,我可以perfomr搜索爲 場的精確值:
//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> = 值的搜索輸入'?

先謝謝你了!

回答

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指向正確的方向!

+0

O_o YW :)現在,請不要誤會我的意思,我喜歡像下一個開發者一樣漂亮的小抽象。也許我錯過了一些東西。你爲什麼不用Cake的神奇的findBy?不需要明確定義findByWhatever('field') - 只需調用它即可。當你滾動findByWhatever時,Cake的Model類會調用一個動態方法,接受'whatever',在Model的字段中查找,然後返回第一個。 (Betcha你無法猜測findAllByWhatever有什麼不同......^_ ^)findBy()/ findAllBy()不支持等於或大於比較嗎? – OpenSorceress

0

從你presetVars -

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

- 從commonProcess()方法,我相信過濾到你find()方法構造了一個廣義找到這樣的條件=>陣列($關鍵=> $ VAL)?

Cake將array key => val對賦值指示爲生成「WHERE $ key = $ val」條件的指示。

做一個模糊的拉,不管你構建一個通用的發現() - 添加一個方法或東西只是推出的兩成

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

或任何你有事情。將參數串在一起以便在您的查詢中獲得所需的效果,並且如果需要,我相信您可以推斷更多抽象該查詢的方法。

如果您需要更復雜的解決方案,Cake提供了優雅的內置,非常強大的子查詢生成。看起來你很難實現很多內置功能,但是我不知道你的情況有多複雜。

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

HTH

+0

謝謝satyrwilder,我會檢查一下! –

0

我知道這已被回答,但有另一種方法可能更適合這種情況。

從文檔

「表達」類型:有用的,如果要添加條件,將通過某種方法產生,和條件字段包含象用於「範圍」在previos樣品幾個參數。這裏的字段包含'Article.views BETWEEN? AND?'和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']]; 
}