2017-02-17 77 views
1

如何在多列搜索警予使用$criteria->compare()$criteria->addCondition()

上我有一個表命名產品,並在這張表內部我有多個列,例如:「productId,name,description ...」 我需要我的用戶能夠搜索多個列,如 $criteria->compare('name' AND 'id' And '','' ,$search,true);但這絕對不行!只有一列工作如下: $ criteria-> addCondition(「name LIKE'%$ search%'」); 或$ criteria-> compare('productId',$ search,true);

我的搜索形式:

<div class="search-bar col-md-9 col-lg-9 no-hor-padding"> 
 
\t <form role="form" onSubmit="return dosearch();" class="navbar-form- navbar-left- search-form" style="padding-left: 0;" 
 
\t \t action="<?php echo Yii::app()->createAbsoluteUrl('/'); ?>" method="get"> 
 
\t \t <input type="text" maxlength="30" placeholder="<?php echo Yii::t('app','Search products'); ?>" class="search-icon form-control input-search <?php echo !empty(Yii::app()->user->id) ? "" : "sign" ?>" name="search"></input> 
 
\t </form> \t \t 
 
</div>

我的功能或控制器:

if(!empty($search)) { 
    //$criteria->addCondition("name LIKE '%$search%'"); 
    $criteria->compare('name',$search,true); 

    $searchCriteria = clone $criteria; 
    $searchproducts = Products::model()->find($searchCriteria); 
    if(empty($searchproducts)){ 
     $catrest = 1; 
     $location = 1; 
    } 
} 

產品::模型()是指產品表 下面是搜索功能表格「hts_products」的模型類。:

public function search() 
 
\t { 
 
\t \t // @todo Please modify the following code to remove attributes that should not be searched. 
 

 
\t \t $criteria=new CDbCriteria; 
 

 
\t \t $criteria->compare('productId',$this->productId); 
 
\t \t $criteria->compare('userId',$this->userId); 
 
\t \t $criteria->compare('name',$this->name,true); 
 
\t \t $criteria->compare('price',$this->price); 
 
\t \t $criteria->compare('quantity',$this->quantity); 
 
\t \t $criteria->compare('sizeOptions',$this->sizeOptions,true); 
 
\t \t $criteria->compare('productCondition',$this->productCondition,true); 
 
\t \t $criteria->compare("from_unixtime(`createdDate`, '%d-%m-%Y')",$this->createdDate,true); 
 
\t \t //if(!empty($this->createdDate)) 
 
\t \t //$criteria->condition = "from_unixtime(`createdDate`, '%d-%m-%Y') = '$this->createdDate'"; 
 
\t \t //else 
 
\t \t //$criteria->compare('createdDate',$this->createdDate); 
 
\t \t /* $criteria->compare('likeCount',$this->likeCount); 
 
\t \t $criteria->compare('commentCount',$this->commentCount); */ 
 
\t \t $criteria->compare('chatAndBuy',$this->chatAndBuy); 
 
\t \t $criteria->compare('exchangeToBuy',$this->exchangeToBuy); 
 
\t \t $criteria->compare('instantBuy',$this->instantBuy); 
 
\t \t $criteria->compare('paypalid',$this->paypalid,true); 
 
\t \t // $criteria->order = 'productId DESC'; 
 
\t \t return new CActiveDataProvider($this, array(
 
\t \t 'criteria'=>$criteria, 
 
\t \t 'pagination'=>array(
 
       'pageSize'=>10, 
 
\t \t), 
 
\t \t 'sort'=>array(
 
       'defaultOrder'=>'productId DESC', 
 
\t \t) 
 

 
\t \t)); 
 
\t }

感謝。

+0

閱讀:http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail? – TomaszKane

+0

感謝@TomaszKane對你的迴應,但仍不明白.. – zaxf

+0

看起來像yii1代碼不是yii2,你確定這是yii2嗎? :) –

回答

0

對於多列,包含變量和用戶輸入的搜索,compare()可能是最佳選擇。從official Yii 1.1.x docs摘自:

比較()方法附加到與新的比較 表達的條件屬性。通過使用某個比較運算符將列與 給定值進行比較來完成比較。 請注意,在比較之前,任何周圍的空白將從值 中刪除。當該值爲空時,將不會在搜索條件中添加比較表達式 。

示例。在模型Invoices,之前提交,空值在搜索表單:

public function search() { 
     $criteria = new CDbCriteria; 
     $criteria->compare('invoice_number', $this->invoice_number); 
     $criteria->compare('city_id', $this->city_id); 
     $criteria->compare('state', $this->state); 

     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, 
     )); 
} 

它將輸出一些類似:

SELECT * FROM `invoices` 

您提交後,所有填寫你的搜索表單中的值:

SELECT * FROM `invoices` 
WHERE (invoice_number = :ycp1 AND city_id = :ycp2 AND state = :ycp3) 

僅限從invoice_number填寫和提交從您的表單。 city_idstate都是空的:

SELECT * FROM `invoices` 
WHERE (invoice_number = :ycp1) 

您可以查看所有compare() method documentation定製它,只要你想。

我建議您使用compare()來匹配數字等確切值。

對於多列LIKE或不精確/近似值的搜索,我建議您使用addSearchCondition()

例子:

public function search() { 
     $criteria = new CDbCriteria; 
     $criteria->compare('invoice_number', $this->invoice_number); 
     $criteria->compare('city_id', $this->city_id); 
     $criteria->compare('state', $this->state); 
     $criteria->addSearchCondition('customer_name', $this->customer_name); 

     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, 
     )); 
} 

它將輸出類似於:

SELECT * FROM `invoices` 
WHERE (invoice_number = :ycp1 AND city_id = :ycp2 AND state = :ycp3 AND customer_name LIKE :ycp4) 

如果您需要更多的compare()代碼示例和CDbCriteriayou can see this nice article其他方法。

+0

謝謝@AlejandroQuiroz,我是一個真正的初學者!在我的情況下不知道該怎麼做!我試試這個:$ criteria-> compare('name',$ search,true); $基準 - - >比較( '的productId',$搜索,真正的); 返回新的CActiveDataProvider($ this,array( 'criteria'=> $ criteria, ));不工作! – zaxf

+0

請用您的模型的所有方法控制器代碼和search()方法來完成您的問題 –

+0

請檢查我的更新@AlejandroQuiroz – zaxf