Поиск отношения Yii CGridView BELONGS_TO: оператор числового сравнения не работает

У меня есть виджет CGridView в моей модели «PointMutationsVarscan», настроенный для поиска числового значения, отличного от pk, в связанной модели, называемой «GeneExpressionCufflinksGene».

Я объявляю переменную поиска в модели PointMutationsVarscan обычным способом для устранения неоднозначности:

public $patient_gecg_search;

Правило поиска в PointMutationsVarscan содержит переменную поиска:

array('id, ... patient_gecg_search, geneExpressionCufflinksGene', 'safe', 'on'=>'search'),

Отношение модели:

'geneExpressionCufflinksGene' => array(self::BELONGS_TO,'GeneExpressionCufflinksGene',array('gene'=>'gene_id')),

Функция поиска:

public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id,true);
// yada yada

$criteria->with[] = 'geneExpressionCufflinksGene';          
if($this->patient_gecg_search) {
$criteria->compare( 'geneExpressionCufflinksGene.fpkm', $this->patient_gecg_search, true);          
$criteria->addSearchCondition("geneExpressionCufflinksGene.fpkm",$this->patient_gecg_search);
}
return new CActiveDataProvider($this, array(
    'criteria'=>$criteria,
        'sort'=>array(
        'attributes'=>array(
            'patient_search'=>array(
                'asc'=>'patient.id',
                'desc'=>'patient.id DESC',
            ),

            'patient_gecg_search'=>array(
                'asc'=>'geneExpressionCufflinksGene.fpkm',
                'desc'=>'geneExpressionCufflinksGene.fpkm DESC',
            ),
            '*',
        ),
        ),
));
}   

В правилах модели GeneExpressionCufflinksGene fpkm является числовым значением:

array('fpkm, fpkm_conf_lo, fpkm_conf_hi', 'numerical'),

Виджет CGridView в представлении PointMutationsVarscan:

$criteria=new CDbCriteria;
$dataProvider=$model->search();
$dataProvider->pagination = array('pageSize' => 15);
$columns=array();
$columns[]= array(
        'name'  => 'patient_gecg_search',
        'value'=>'$data->geneExpressionCufflinksGene->fpkm', 
        'type'  => 'raw',
        'htmlOptions'=>array('style'=>'width:250px;'),
    ); 

$this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'point-mutations-varscan',
        'dataProvider'=>$model->search(),
        'filter'=>$model,
        'columns'=>$columns,
    )
);

По сути, проблема в том, что я не могу выполнить поиск числового сравнения (> ‹ = и т. д.) в этом столбце отношения. Он выполняет только поиск по совпадению строк. Например, если я ищу 123, он вернет все числовые значения fpkm, соответствующие 123, но если я наберу ‹123 или> 1, он не вернет никаких записей, как вы ожидаете для локального параметра.

fpkm — это число с плавающей запятой двойной точности в базе данных. Я могу использовать операторы сравнения для fpkm в собственном виджете CGridView модели GeneExpressionCufflinksGene. Операторы сравнения терпят неудачу только при поиске в качестве отношения через модель PointMutationsVarscan.

Спасибо за любое понимание, которое у вас может быть по этому поводу.


person 111    schedule 12.10.2012    source источник
comment
К сожалению, это не помогло. Я думаю, что аргумент частичного совпадения применяется только к поиску строк, поэтому, если вы укажете оператор сравнения, он не будет использовать LIKE, а будет использовать оператор, а не% в строке.   -  person 111    schedule 12.10.2012
comment
Почему у вас есть сравнение и addSearchCondition в одном и том же поле?   -  person Pentium10    schedule 12.10.2012
comment
Пентиум 10, спасибо. Если я уберу свою строку addSearchCondition, сравнение пройдет нормально. Если вы хотите опубликовать это как ответ, я приму это. Вероятно, поэтому или сработало, потому что это добавляло строковое условие, и мне нужно было ИЛИ, чтобы разрешить сравнение. Спасибо :)   -  person 111    schedule 12.10.2012


Ответы (1)


И решение......

$criteria->addSearchCondition("geneExpressionCufflinksGene.fpkm",$this->patient_gecg_search, $escape=true, $operator='OR');

Я добавил escape-параметр и изменил оператор на OR вместо стандартного AND. Я предполагаю, что он также выполняет поиск строки где-то там, и использование оператора OR позволяет выполнять операцию сравнения в дополнение к сравнению строк. Очевидно, я чего-то не понимаю, но, тем не менее, числовые сравнения теперь возвращают правильные результаты.

person 111    schedule 12.10.2012