【问题标题】:How to search in multiple columns on yii using $criteria->compare() or $criteria->addCondition()如何使用 $criteria->compare() 或 $criteria->addCondition() 在 yii 的多个列中搜索
【发布时间】:2017-02-17 12:20:53
【问题描述】:

如何使用$criteria->compare()$criteria->addCondition()yii上搜索多个列

我有一个名为 product 的表,在这个表中我有多个列,例如:“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">
	<form role="form" onSubmit="return dosearch();" class="navbar-form- navbar-left- search-form" style="padding-left: 0;"
		action="<?php echo Yii::app()->createAbsoluteUrl('/'); ?>" method="get">
		<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>
	</form>		  
</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;
    }
}

Products::model() 参考产品表 这是表“hts_products”的搜索功能表单模型类。:

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

		$criteria=new CDbCriteria;

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

		));
	}

谢谢。

【问题讨论】:

  • 感谢@TomaszKane 的回复,但还是不明白..
  • 看起来像yii1代码不是yii2,你确定这是yii2吗? :)
  • 是的,对不起,它的 yii1
  • 谢谢@Insane Skull,请查看更新。

标签: php yii yii2-advanced-app yii-extensions


【解决方案1】:

对于包含变量和用户输入的多列搜索,compare() 可能是最佳选择。取自official Yii 1.1.x docs

compare() 方法使用新的比较附加到条件属性 表达。比较是通过将列与 使用一些比较运算符给定值。 请注意,任何周围的空格都将从值中删除 比较之前。值为空时,无比较表达式 将添加到搜索条件中。

示例。在模型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() 的代码示例以及来自CDbCriteria 的其他方法you can see this nice article

【讨论】:

  • 谢谢@AlejandroQuiroz,我是一个真正的初学者!在我的情况下不知道该怎么做!我试过这个: $criteria->compare('name',$search,true); $criteria->compare('productId',$search,true); return new CActiveDataProvider($this, array( 'criteria' => $criteria, ));不工作!
  • 请使用您模型的所有方法控制器代码和 search() 方法完成您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2014-10-18
相关资源
最近更新 更多