2

選択しているフィールドで(のように)CDbCriteria検索を行う方法はありますが、条件を手動で追加する代わりにcompare()モデルのメソッドを使用しますか?search()compare()

私は、数行少なく、それ以上でもそれ以下でもないソリューションを目指していることに注意してください。したがって、解決策が本当にハッキーなものや厄介なものである場合は、「add-a-few-compares()」メソッドを使用します。

私の現在のコード:

$criteria = new CDbCriteria;
$criteria->with = array('A', 'B', 'C', 'D', 'E');

$criteria->compare("A.field1", "test", false, 'OR');
$criteria->compare("A.field2", "test", false, 'OR');
$criteria->compare("B.field1", "test", false, 'OR');
$criteria->compare("B.field2", "test", false, 'OR');

$dataProvider = new CActiveDataProvider('Z', array(
    'criteria'=>$criteria,
    //pagination...
    //more options...
));
4

1 に答える 1

2

更新:あなたは実際に(この回答の下のコメントから)部分的な一致を探しているようです、そしてそのためにあなたはtrueあなたのcompare呼び出しに渡す必要があります:

$criteria->compare("A.field1", "test", true, 'OR');

それでも:に渡すことができますaddCondition

$criteria->addCondition('A.field1 LIKE "%test"','OR');
// or with params as below
$criteria->addCondition('A.field2 LIKE :test','OR');
$criteria->params=array(
    ':test'=>'%test%',
);

コメントですでに述べたように、各モデルのデフォルトのsearch()方法を使用することは不可能だと思います。ただし、他の選択肢もあります。たとえば、addCondition代わりに使用できます。

$criteria = new CDbCriteria;
$criteria->with = array('A', 'B', 'C', 'D', 'E');
$criteria->together = true; // you'll need together so that the other tables are joined in the same query

$criteria->addCondition('A.field1 = "test"','OR');
$criteria->addCondition('A.field2 = "test"','OR');
// and so on

compare 比較のために演算子を「インテリジェントに」決定したい場合、たとえば、ユーザー入力からテスト値を取得していて、ユーザーが演算子(<、>、<=など)の使用が許可されています。条件で使用する演算子を決定した後、compareそれに応じて、を含む他の関数を呼び出しますaddCondition。したがって、を使用addConditionすると、これらの不要なチェックを少なくとも回避できます。

さらに、あなたがしなければならないのが同等性だけをチェックすることである場合、すなわちあなたのSQLが次のWHEREようになっている場合:

WHERE A.field1 = "test" OR A.field2 = "test"

そうすれば、は必要なくaddCondition、もっと複雑なものを使用することができますconditiondoc):

$criteria->condition='A.field1 = "test" OR A.field2 = "test"';
// or even better if you use params
$criteria->condition='A.field1 =:test1 OR A.field2 =:test2 OR B.field1 =:test3 OR B.field2 =:test3';
$criteria->params=array(
    ':test1'=>'test',
    ':test2'=>'anothertest',
    'test3'=>'tests' // omitting ':' here for params also works
);
于 2012-10-24T14:09:08.520 に答える