1

「PointMutationsVarscan」モデルにCGridViewウィジェットがあり、「GeneExpressionCufflinksGene」と呼ばれる関連モデルの非pk値の数値を検索するように設定されています。

曖昧さを解消するために、通常の方法で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'),

PointMutationsVarscanビューのCGridViewウィジェット:

$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を検索すると、123に一致するすべての数値fpkm値が返されますが、<123または> 1を実行すると、レコードは返されません。ローカルパラメーターに期待するとおりです。

fpkmは、データベース内の倍精度浮動小数点数です。GeneExpressionCufflinksGeneモデル自体のCGridViewウィジェット内でfpkmの比較演算子を問題なく使用できます。比較演算子は、PointMutationsVarscanモデルを介して関係として検索する場合にのみ失敗します。

あなたがこれについて持っているかもしれないどんな洞察にも感謝します。

4

1 に答える 1

1

そして解決策は……

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

エスケープ パラメータを追加し、演算子をデフォルトの AND ではなく OR に変更しました。私の推測では、どこかで文字列検索も行っており、OR 演算子を使用すると、文字列比較に加えて比較操作を行うことができます。明らかに私が理解していないことがありますが、それにもかかわらず、数値比較は適切な結果を返すようになりました。

于 2012-10-12T18:31:49.437 に答える