Yii使用条件搜索并添加参数

时间:2013-05-25 22:29:31

标签: search activerecord yii criteria

我有一个表单,我想在我的数据库中搜索。我用所有参数创建对象,但我有一个问题。在一个文本字段中写入搜索工作正常并且查询正确运行。当写两个或更多文本字段时,params不起作用,并且我执行查询失败:

WHERE (((((id_reservation =:id_reservation)AND(start =:start))AND(end =:end))AND (fkCustomer.first_name =:如first_name))

params不会取代。

    $criteria=new CDbCriteria;
    $criteria->with =array('fkCustomer');
    if(!empty($start))
    {
        $criteria->addCondition('start=:start');
        $criteria->params=array(':start'=>$start);
    }
    if(!empty($end))
    {

        $criteria->addCondition('end=:end');
        $criteria->params=array(':end'=>$end);
    }
    if(!empty($merge->customer_name))
    {

        $criteria->addCondition('fkCustomer.first_name=:first_name');
        $criteria->params=array(':first_name'=>$merge->customer_name);
    }
    if(!empty($merge->customer_surname))
    {

        $criteria->addCondition('fkCustomer.last_name=:last_name');
        $criteria->params=array(':last_name'=>$merge->customer_surname);
    }
    if(!empty($merge->customer_email))
    {

        $criteria->addCondition('fkCustomer.email=:email');
        $criteria->params=array(':email'=>$merge->customer_email);
    }
    $criteria->limit = 100;

4 个答案:

答案 0 :(得分:3)

这是因为在每个if块中都替换了params数组。在if块中构建一个数组,然后将其添加到块外的最后一行的$criteria->params

例如:

$criteria=new CDbCriteria;
$criteria->with =array('fkCustomer');
$my_params = array();

if(!empty($end))
{
    $criteria->addCondition('end=:end');
    $my_params['end'] = $end;
}

if(!empty($merge->customer_name))
{
    $criteria->addCondition('fkCustomer.first_name=:first_name');
    $my_params['first_name'] = $merge->customer_name;
}

// other ifs ..

//then
$criteria->limit = 100;
$criteria->params = $my_params;

另外,如果我没记错的话,你不需要在params数组中写':end'和':first_name',它将在没有冒号的情况下工作。

答案 1 :(得分:1)

您还有以下替代

$criteria=new CDbCriteria;
$criteria->with = 'fkCustomer';

if(!empty($end))
{
    $criteria->compare('end', $end);
}

if(!empty($merge->customer_name))
{
    $criteria->compare('fkCustomer.first_name', $merge->customer_name);
}

// The following conditions ..

// Limit:
$criteria->limit = 100;

答案 2 :(得分:0)

嗨我认为这与我之前使用params变量的问题相同,为了避免这个问题我使用CMap :: mergeArray函数

发生这种情况是因为每次条件通过变量时都会覆盖变量。

这是避免它的语法,它是一个例子

$criteria=new CDBCriteria;
$criteria->addBetweenCondition("Date",$datestart,$dateend);
$criteria->addCondition("Type=:type");
//$criteria->params=array(":type"=>"1"); //This is wrong, overwrites addBetweenCondition params
$criteria->params=CMap::mergeArray($criteria->params,array(
    ":type"=>"1",
)); //This is ok, mantain all parameters in the params var
$query=Model::findAll($criteria);

答案 3 :(得分:0)

можнообратитьсянапрямую

 $criteria=new CDbCriteria;
    $criteria->with =array('fkCustomer');
    if(!empty($start))
    {
        $criteria->addCondition('start=:start');
        $criteria->params['start']=$start;
    }
    if(!empty($end))
    {

        $criteria->addCondition('end=:end');
        $criteria->params['end']=$end;
    }
    if(!empty($merge->customer_name))
    {

        $criteria->addCondition('fkCustomer.first_name=:first_name');
        $criteria->params['first_name']=$merge->customer_name;
    }
    if(!empty($merge->customer_surname))
    {

        $criteria->addCondition('fkCustomer.last_name=:last_name');
        $criteria->params['last_name']=$merge->customer_surname;
    }
    if(!empty($merge->customer_email))
    {

        $criteria->addCondition('fkCustomer.email=:email');
        $criteria->params['email']=$merge->customer_email;
    }
    $criteria->limit = 100;
相关问题