0

これが私がYiiを介して達成したいSQLですCDBCriteria

WHERE 
    (
        (field1 LIKE '%value1%') AND (field1 LIKE '%value2%')
    ) OR (
        (field2 LIKE '%value1%') AND (field2 LIKE '%value2%')
    ) OR (
        (field3 LIKE '%value1%') AND (field3 LIKE '%value2%')
    )

文字列に「value1」または「value2」が任意の順序で含まれている場合、これは行を返します。元。:

Lorem value1 ipsum value2 sirdoloramet。

また

Lorem value2 ipsum value1 sirdoloramet。

ただし、値が1つしかない場合は、何も返されません。

私が試したこと(このスレッドから):

$c = new CDbCriteria;
$c->addColumnCondition(array('field1 LIKE' => '%value1%', 'field1 LIKE' => '%value2%'), 'AND', 'OR');
$c->addColumnCondition(array('field2 LIKE' => '%value1%', 'field2 LIKE' => '%value2%'), 'AND', 'OR');
$c->addColumnCondition(array('field3 LIKE' => '%value1%', 'field3 LIKE' => '%value2%'), 'AND', 'OR');

ただし、これはLIKE条件で使用する方法ではなく、キーが同じフィールドで同じであるため、2番目の比較のみが返されます。

(
    (field1 LIKE='%value2%') OR (field2 LIKE='%value2%')
) OR (field3 LIKE='%value2%')

だから私は比較条件で試しました:

$c->compare('field1', 'value1', true);
$c->compare('field1', 'value2', true, 'OR');
$c->compare('field2', 'value1', true, 'AND');
$c->compare('field2', 'value2', true, 'OR');
$c->compare('field3', 'value1', true, 'AND');
$c->compare('field3', 'value2', true, 'OR');

また

$c->addSearchCondition('field1', 'value1', false);
$c->addSearchCondition('field1', 'value2', false, 'OR');
$c->addSearchCondition('field2', 'value1', false);
$c->addSearchCondition('field2', 'value2', false, 'OR');
$c->addSearchCondition('field3', 'value1', false);
$c->addSearchCondition('field3', 'value2', false, 'OR');

しかし、私はそれをうまくやって、私が望む状態を返すことができませんでした。これが私が得るものです:

(
    (
        (
            (
                (field1 LIKE '%value1%') OR (field1 LIKE '%value2%')
            ) 
            AND (field2 LIKE '%value1%')
        ) 
        OR (field2 LIKE '%value2%')
    ) 
    AND (field3 LIKE '%value1%')
) OR (field3 LIKE '%value2%')

だから誰かがこれを達成する方法を知っているなら、私を助けてください:)

4

1 に答える 1