簡體   English   中英

Yii基於條件的SQL查詢錯誤

[英]Yii the SQL query error based on Criteria

我想搜索一些模型事件,同時根據時間和相關用戶過濾它們。 如果我在Grid中執行它,則效果很好。 但是,當我在網格輸入中另外輸入一些數據以搜索Event的其他屬性時,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;
}

該如何解決?

輸入其他數據時失敗的原因是,至少使用了一條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 . '" ');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM