2016-07-01 50 views
2

我有问题全名自动完成。 我有一个usertable,它包含firstname,lastname columns.through ajax。Yii2条件与concat

在搜索行动,这是我的代码:

$users = (new Query()) 
       ->select('*') 
       ->from($userTable) 
       ->where(['like', 'username', $searchTerm]) 
       ->orWhere(['like', 'firstname', $searchTerm]) 
       ->orWhere(['like','lastname', $searchTerm])  
       ->andWhere(['<>','id', Yii::$app->user->id]) 
       ->andWhere(['status'=>self::STATUS_ACTIVE]) 
       ->orderBy('username') 
       ->limit(20) 
       ->all(); 

我的问题是,当我试图用姓氏渐渐空虚记录搜索名字。

感谢您的支持,我必须保持CONCAT

解决
$users = (new Query()) 
        ->select('*') 
        ->from($userTable) 
        ->where(['like', 'username', $searchTerm]) 
        ->orWhere(['like', "CONCAT(firstname, ' ', lastname)", $searchTerm]) 
        ->andWhere(['<>','id', Yii::$app->user->id]) 
        ->andWhere(['status'=>self::STATUS_ACTIVE]) 
        ->orderBy('username') 
        ->limit(20) 
        ->all(); 
+0

[This](http://stackoverflow.com/questions/31297668/yii2-gridview-merge-two-columns/3 8130105#38130105)可能会有帮助... –

回答

-2

可能是你可以用

->orWhere(" concat('firstname', ' ' , 'lastname') like '%" . $searchTerm . "' ") 
+1

SQL注入可能在这里。 – cronfy

+0

@cronfy相关的$ searchTerm通常是用alireay检查以避免Yii2框架的sqlinjection ..出于以下几个原因..并且问题是关于如何构建适当的concat过滤器.. – scaisEdge

+1

这不是正确的方法,因为它是不安全的。即使在您的上下文中它是安全的,但如果将代码复制到另一个环境或另一个用例,它会导致sql注入。更好地使用他在问题更新中发布的作者自己的解决方案。 – cronfy

0

下面的代码工作正常,我替补多两个orWhere的姓名和lasta名使用SQL数据库

$query->orWhere(['like', "CONCAT([staff].[first_name], ' ',[staff].[middle_name],' ', [staff].[last_name])", $this->name]);