2011-06-20 13 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:

//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(); 

まとめると:上記のコードでを、私は年齢フィールドの正確な値の検索をperfomrすることができます。 '年齢> = の値を入力して'を検索するにはどうすればよいですか?

あらかじめご了承ください!

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

- - あなたのpresetVarsから

答えて

1

これは、私はそれを解決する方法である(あるいは少なくとも私がこれまで行ってきたすべてのテストで動作するようだ):

  • を変更

    array('name' => 'age', 'type' => 'query', 'method' => 'findByAge', 'field' => 'Person.age'), 
    
  • filterArgsアレイの次の行で '年齢'行
  • 同じモデルで、次の方法を追加しました:それだ

    public function findByAge($data = array()) { 
    
        $query = array(
            'Person.age >=' => $data['age'], 
            ); 
        return $query; 
    } 
    

を! 'クエリ'型では、メソッドを使用して複雑なクエリをメインクエリに追加できます。 Satyrwilderが正しい方向を指してくれてありがとう!

+0

O_o YW :)今、私を間違えないでください。私は、次の開発者ほど気の利いた小さな抽象を愛しています。たぶん私は何かが欠けているでしょう。なぜケーキの魔法を使うのではなかったの? findByWhatever( 'field')を明示的に定義する必要はありません。単に呼び出します。 CakeのModelクラスは、findByWhateverをロールバックしたときに動的メソッドをロールバックし、 '何でも'を取り、フィールドのModel内を探し、最初を返します。 (Betchaでは、findAllByWhateverについて何が違うのか推測できません...^_ ^)findBy()/ findAllBy()は、equal-or-greater-than比較をサポートしていませんか? – OpenSorceress

0

は私が推測あなたのcommonProcess()メソッドから、あなたのfind()メソッドにダウンフィルタ条件のような一般のfind =>配列($キー=> $構築val)?

Cakeは、 "WHERE $ key = $ val"条件を生成するための指示として配列キー=> valペアの割り当てを見ます。あなたはその一般的な検索を(構築どこぼやけプルを行うには

) - ちょうど

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

またはものは何でも起こって持っているにそれらの2をロールバックする方法か何かを追加します。あなたのクエリに必要な効果の引数をまとめてストリングしてください。必要に応じて、そのクエリを抽象化するためのさらなる方法を推論することができます。

もっと複雑な解決策が必要な場合は、Cakeはエレガントな組み込みの非常に強力なサブクエリ生成を提供します。多くのビルトイン機能を実現するために非常に苦労しているようですが、もう一度あなたの状況がどれほど複雑か分かりません。

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

HTH

+0

ありがとうsatyrwilder、私はそれをチェックします! –

0

私はこれが解決されていることを知っていますが、この状況に適している別の方法があります。ドキュメントから

「式」タイプ:あなたは、いくつかの方法で生成された状態、および条件フィールドを追加したい場合に便利「範囲」のために使用中&過去のサンプルのようないくつかのパラメータが含まれています。ここのフィールドには 'Article.views BETWEEN? AND? ' Article :: makeRangeConditionは2つの値の配列を返します。

Full Article Here

私はあなたがやったと同じことを達成するために持っていたが、5つのフィールドを持ちます。私はそれぞれの質問を書く必要はありませんでした。ここで私は式の型で同じことを達成しました。これはfilterArgs配列にあります。

array(
    'name'=>'bathrooms', 
    'type'=>'expression', 
    'method'=>'returnNumber', 
    'field'=>'House.bathrooms >= ?' 
) 

次に、モデルにこの関数を作成して、ユーザーが送信した数値を返します。呼び出されると、returnNumberは2つの配列を渡されます。

このような感じです。

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']]; 
} 
関連する問題