Я хочу использовать 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.
заранее спасибо
Если впоследствии вам не нужно полное имя, вы можете просто использовать метод 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);
Обратите внимание, что в этом случае ваша модель пользователя должна иметь атрибут полного имени, иначе вы не сможете получить доступ к полю полного имени.
Я думаю, что это более оригинальный способ использования 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).