2013-05-25 6 views
0

У меня есть одна форма, и я хочу найти в своей базе данных. Я создаю объект со всеми параметрами, но у меня одна проблема. При записи в одном текстовом поле поиск работает нормально, и запрос выполняется правильно. При написании двух или более полей params не работает, и у меня есть сбой выполнения запроса:Yii поиск по критериям и добавить параметры

WHERE (((id_reservation =: id_reservation) AND (start =: start)) AND (end =: end)) И (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; 

ответ

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; 

Кроме того, если я правильно помню, вам не нужно писать «: конец» и «: first_name» в params массиве, он будет работать без двоеточия.

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; 
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); 
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; 
+2

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

+0

@ mayank-jain Это ассемблер;) –

+0

Я не могу этого понять. Это связано с программированием? –

Смежные вопросы