2014-11-11 9 views
1

Я хочу использовать Mysql Concat Function в like expression.
Я хочу объединить firstname и lastname как fullname и получить согласованные результаты согласно fullname.
Я пробовал это в YII1. Ниже мой код:Yii1: Как использовать функцию concat в mysq как запрос

$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

Я не эксперт int Yii, но вам нужно добавить 'CONCAT (firstname," ", lastname)' в самом условии, так как псевдоним не может использоваться там где. –

+0

$ criteria = новый CDbCriteria(); $ criteria-> select = '*'; $ criteria-> addCondition ('CONCAT (имя, фамилия) AS fullname LIKE: match'); но проблема остается такой же. – FahadAkram

+0

no '$ criteria-> addCondition ('CONCAT (firstname," ", lastname) LIKE: match');' –

ответ

2

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

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

Однако, если вы хотите сохранить полное имя в ВЫБРАТЬ положение, вы можете использовать этот псевдоним в 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 поля.

+0

yes Я добавил общедоступное свойство $ fullname для пользователя модели и теперь работает – FahadAkram

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

UPDATE

Если вы используете Mysql проблема с помощью этого совокупный столбец (полное имя) в разделе where.
Если вы просто выберите этот столбец (FULLNAME) и получить его искусственной собственность в вашей модели, это нормально но если вы хотите использовать его в where clause запросе, это невозможно, потому что это ограниченное на сервере MYSQL. Это ошибка, вы получите:

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

Так что вам нужно повторить функцию SQL (Concat) в пункте, где тоже (вы не можете использовать псевдонимы столбцов в выражении WHERE).

+0

Действительно , но вы можете использовать псевдоним, если вы переместите условие в предложение 'having'. – JonathanStevens