Php Yii1:如何在类似mysq的查询中使用concat函数

Php Yii1:如何在类似mysq的查询中使用concat函数,php,mysql,activerecord,yii,yii1.x,Php,Mysql,Activerecord,Yii,Yii1.x,我想在类似表达式的中使用Mysql Concat函数我想将firstname和lastname合并为fullname,并根据fullname获得匹配结果我在YII1中尝试过这一点。下面是我的代码: $criteria = new CDbCriteria(); $criteria->select = "*"; $criteria->select = 'CONCAT(firstname , "" , lastname) AS fullname'; $cr

我想在类似表达式的
中使用
Mysql Concat函数

我想将
firstname
lastname
合并为
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.

提前感谢

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

$criteria = new CDbCriteria();
$criteria->addCondition('CONCAT(userId , " " , username) LIKE :match');
$criteria->params = array(':match' => $query);
$models = User::model()->findAll($criteria);
但是,如果要在SELECT子句中保留全名,则只能在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);

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

我认为这是一种使用
SQL函数的更具OO风格的方法。
(@JonathanStevens的答案是正确的,顺便说一句):

$criteria=新的CDbCriteria();
$criteria->select=['*',new\cdbeexpression(“CONCAT(firstName),,lastName)作为fullname”);
$criteria->addCondition('CONCAT(firstName',lastName)LIKE:match');芬德尔(标准);
更新

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

#1054-where子句中的未知列“全名”


因此,您也需要在where子句中重复您的SQL函数(concat)(您不能在where子句中使用别名列)。

我不是int Yii专家,但您需要在条件本身中添加
concat(firstname,“,lastname)
,因为别名不能在where中使用。$criteria=new CDbCriteria()$标准->选择='*'$criteria->addCondition('CONCAT(firstname,lastname)作为fullname,比如:match');但问题仍然是sameno
$criteria->addCondition('CONCAT(firstname,“,lastname)LIKE:match')
是,我为模型用户添加了public$fullname属性,现在确实可以使用,但是如果将条件移动到
having
子句,则可以使用别名。
$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);