Cgridview Belongs_To Relation Search: Numeric Comparison Operator Fails

Hello everyone

I have a CGridView widget in my "PointMutationsVarscan" model set up to search a numeric non-pk value in a related model, called "GeneExpressionCufflinksGene"

I declare the search var within the PointMutationsVarscan model in the usual way to disambiguate:


public $patient_gecg_search;

Search rule in PointMutationsVarscan contains search var:


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



Model relation:


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



Search function:




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',

            ),

            '*',

        ),

        ),

));

}

In the GeneExpressionCufflinksGene model rules, fpkm is a numeric value:




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

The the CGridView widget in the PointMutationsVarscan view:


$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,

    )

);

The problem is that I can’t do a numeric comparison search (> < = etc ) on this belongs to relation column. It only does a string matching search. For example if I search for 123, it will return all the numeric fpkm values that match 123, but if I do <123 or >1 it doesn’t return any records, they way you’d expect for a local parameter.

fpkm is a double precision float in the database. I can use comparison operators on fpkm just fine within the GeneExpressionCufflinksGene model’s own CGridView widget. Comparison operators only fail when searching as a relation through the PointMutationsVarscan model.

Thanks for any insight you might have on this.

Dear glyph

I hope the following changes can make things better.




public function search()

{

$criteria=new CDbCriteria;

$criteria->compare('id',$this->id);

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


//Set parameter $partialMatch to false

$criteria->compare( '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',

            ),

            '*',

        ),

        ),

));

}






Regards.