【问题标题】:Yii the SQL query error based on CriteriaYii 基于 Criteria 的 SQL 查询错误
【发布时间】:2013-09-27 07:50:16
【问题描述】:

我想搜索一些模型事件,同时按时间和相关用户过滤它们。 我在网格中做它工作正常。然而,当我在网格输入中额外输入一些数据以搜索事件的其他属性时,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;
}

如何解决问题?

【问题讨论】:

  • 打开 CWebLogRoute 并在配置文件的 db 组件中将 'enableProfiling' 和 'enableParamLoggin' 设置为 'true' 以查看哪些参数是有界的。 yiiframework.com/doc/guide/1.1/nl/topics.logging
  • $events 是包含与 $currentUser 相关的事件 ID 的数组。

标签: sql yii criteria


【解决方案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 . '" ');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多