0

時間ベースと関連ユーザー ベースの両方でフィルタリングしながら、いくつかのモデル イベントを検索したいと考えています。グリッドでそれを行うと、正常に動作します。それでも、イベントの他の属性を検索するためにグリッド入力にいくつかのデータを追加入力すると、ajax の応答は次のようになります: 無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません。 ここに画像の説明を入力 「IN 条件」(クエリに表示) が基準に追加されます。

 $newCriteria = new CDbCriteria;        
 // get events id (several ) of current user
 $events = $model->getEvents($currentUser);
 // add the condition into criteria;  't' being the model table alias
 if ($events) $newCriteria->addInCondition('t.Id', $events); 
 // merge with criteria from the model (DocEvents)
 $newCriteria->mergeWith($model->criteria());

 $dataProvider = new CActiveDataProvider('DocEvents', array(
        'criteria'=>$newCriteria,//$model->criteria(), 
    ));

 $this->widget('bootstrap.widgets.TbGridView', array(
'dataProvider'=>$dataProvider,   
'filter'=>$model,'columns'=>array(
    'Id',
    'Subject',
    'EventTypeId',
    'Begin',
    'End',
    array(
        'class'=>'bootstrap.widgets.TbButtonColumn',
    ),
  ),
));     

モデル ファイルの条件:

 public function criteria()
{
    $criteria=new CDbCriteria;

    $criteria->compare('Id',$this->Id);
    $criteria->compare('Subject',$this->Subject,true);
    $criteria->compare('Notes',$this->Notes,true);
    $criteria->compare('Place',$this->Place,true);
    $criteria->compare('EventTypeId',$this->EventTypeId,true);
    $criteria->compare('Percentage',$this->Percentage);
    $criteria->compare('ReflectInCalendar',$this->ReflectInCalendar);
    $criteria->compare('ParentId',$this->ParentId);
    $criteria->compare('Priority',$this->Priority);
    $criteria->compare('StatusId',$this->StatusId);
    $criteria->compare('Comment',$this->Comment,true);
    $criteria->compare('PlanHours',$this->PlanHours);
    $criteria->compare('Tags',$this->Tags,true);

    $conditions=array();
    if ($this->Begin) $conditions[] = 'Begin >= "' . $this->Begin . '" ';
    if ($this->End) $conditions[] = 'End <= "' . $this->End . '" ';
    $criteria->condition = implode(' AND ', $conditions);

    return $criteria;
}

問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

追加のデータを入力すると失敗する理由は、少なくとも 1 つのcompare行が使用されているためです。これにより、条件のその部分のパラメーター (別名 where 句) をバインドすると共に、最終的に条件の条件の一部が構築されます。

ただし、criteria()メソッドの最後で、条件を次の行で上書きします。

$criteria->condition = implode(' AND ', $conditions);

これにより、パラメーターがバインドされますが、すべてのトークンが上書きされます。

そのため、使用

$criteria->addCondition(implode(' AND ', $conditions));

代わりに、既に作成した where 句を上書きしないようにします。

または、さらに単純に、$conditions配列を内破する代わりに次を使用します。

if ($this->Begin) $criteria->addCondition('Begin >= "' . $this->Begin . '" ';
if ($this->End) $criteria->addCondition('End <= "' . $this->End . '" ');
于 2013-09-28T07:17:35.420 に答える