Yii1:如何在mysql中使用concat函数,如查询

时间:2014-11-11 14:16:47

标签: php mysql activerecord yii yii1.x

我想在Mysql Concat Function中使用like expression
我想将firstnamelastname合并为fullname,并根据fullname获得匹配的结果。我在YII1尝试了这个。以下是我的代码:

    $criteria = new CDbCriteria();
    $criteria->select = "*";
    $criteria->select = 'CONCAT(firstname , "" ,  lastname) AS fullname';
    $criteria->addCondition('fullname LIKE :match');
    $criteria->params = array(':match' => $query);
    $models = User::model()->findAll($criteria);

以下是生成的错误消息:

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fullname' in 'where clause'
(Error 500)
    CDbCommand::fetchColumn() failed: SQLSTATE[42S22]: Column not found: 1054
Unknown column 'fullname' in 'where clause'. The SQL statement executed
was: SELECT COUNT(*) FROM `members` `t` WHERE fullname LIKE :match.

提前致谢

2 个答案:

答案 0 :(得分:2)

如果之后你不需要全名,你可以在WHERE子句中使用CONCAT方法:

$criteria = new CDbCriteria();
$criteria->addCondition('CONCAT(userId , " " , username) LIKE :match');
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);

但是,如果您确实希望在SELECT子句中保留fullname,则只能在HAVING子句中使用此别名:

$criteria = new CDbCriteria();
$criteria->select = '*, CONCAT(userId , " " , username) AS fullname';
$criteria->having = 'fullname LIKE :match';
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);

请注意,在这种情况下,您的用户模型应该具有fullname属性,否则您将无法访问fullname字段。

答案 1 :(得分:0)

我认为这是一种更为OO的方式使用SQL Functions(@ JonathanStevens的回答是正确的):

$criteria = new CDbCriteria();    
    $criteria->select = ['*', new \CDbExpression("CONCAT(firstName, ' ', lastName) as fullname")];
    $criteria->addCondition('CONCAT(firstName, ' ', lastName) LIKE :match'); <<<< This is still a problem
    $criteria->params = array(':match' => $query); 
    $models = User::model()->findAll($criteria);

<强>更新

如果您使用的是Mysql,则问题是在where子句中使用此聚合列(fullname)。
如果您只是选择该列(全名)并通过模型中的人工属性获取它,那么可以>如果您想在where clause中使用它一个查询,它是不可能的,因为它受MYSQL服务器的限制。这是您将得到的错误:

#1054 - Unknown column 'fullname' in 'where clause'

所以你需要在where子句中重复你的SQL函数(concat)(你不能在where子句中使用别名列)。