2017-02-17 40 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_id и state пустуют:

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); $ Criteria-> сравнить ('PRODUCTID', $ поиска, истинный); return new CActiveDataProvider ($ this, array ( 'criteria' => $ criteria, )); Не работает! – zaxf

+0

Пожалуйста, заполните свой вопрос всем методом кода контроллера и методом поиска() вашей модели –

+0

Пожалуйста, уточните мое обновление @AlejandroQuiroz – zaxf

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

  • Нет связанных вопросов^_^