Yii1: Как использовать функцию concat в MySQL, как запрос

Я хочу использовать Mysql Concat Function в like expression,
Я хочу слить 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.

заранее спасибо

1

Решение

Если впоследствии вам не нужно полное имя, вы можете просто использовать метод CONCAT в предложении WHERE:

$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);

Обратите внимание, что в этом случае ваша модель пользователя должна иметь атрибут полного имени, иначе вы не сможете получить доступ к полю полного имени.

2

Другие решения

Я думаю, что это более оригинальный способ использования 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.
если ты просто выберите этот столбец (полное имя) и получить его с помощью искусственного свойства в вашей модели, это нормально но если вы хотите использовать его в where clause запроса, это невозможно, потому что это ограничено сервером MYSQL. Это ошибка, которую вы получите:

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

Поэтому вам нужно повторить свою функцию SQL (concat) в предложении where (вы не можете использовать столбцы псевдонимов в предложении where).

0

По вопросам рекламы [email protected]