2017-07-17 1 views
0

Je suis nouveau sur Zend et sur Postgres. Ma table Users contient une colonne FirstName et une colonne LastName.ZF2 - Comment concaténer correctement une instruction select contenant une fonction CONCAT

Je souhaite interroger la table à l'aide d'une seule chaîne 'nom complet'; par exemple. $search = 'John Sm'.

J'essaie d'utiliser la fonction CONCAT_WS pour concaténer les deux noms de la table, puis comparez cela avec la chaîne de recherche.

Ma déclaration

$select->where(array('CONCAT_WS(" ", "u"."FirstName", "u"."LastName") LIKE ?' => array("%$search%")));

J'ai essayé différentes combinaisons mais ne peut pas sembler obtenir le droit de concaténation.

Un exemple de la déclaration que je veux est SELECT * FROM Users WHERE 'firstname lastname' LIKE '%john s%'

Répondre

0

Cela ne répond pas à votre question, mais avez-vous envisagé de faire une vue à ce sujet?

0

Si vous utilisez tableau en tant que paramètre dans votre $select->where() il est interprété comme paires ['column1' => 'value', 'column2' => 'value']. Dans cette solution, vous ne pouvez pas utiliser les fonctions et les parties combinées de la requête.

Vous pouvez utiliser Zend\Db\Sql\Predicate\Literal(), par exemple .:

$select->where 
    ->literal('CONCAT_WS(" ", "u"."FirstName", "u"."LastName") LIKE \'%word%\'') 

ou utilisez Zend\Db\Sql\Predicate\Expression(), par exemple .:

$select->where 
     ->expression('CONCAT_WS(" ", "u"."FirstName", "u"."LastName") LIKE \'%?%\'', $word) 

(second paramètre peut abeille tableau si des variables est plus)

Dans ce solution que vous pouvez construire sql WHERE en utilisant la même méthode

$select->where 
    ->equalsTo() 
    ->or 
    ->greatherThan() 
    ->and 
    ->like() 
    ->nest() 
    ->lessThan() 
    ->or 
    ->literal() 
    ->unnest() 
    ... 

https://framework.zend.com/manual/2.2/en/modules/zend.db.sql.html#id7

vous pouvez également construire comme Zend\Db\Sql\Where/Zend\Db\Sql\Predicate comme par exemple .:

$where = new Where(); 
$where->equalsTo();// and more, more, more, with sub-where inclusive 
$select->where->predicate($where);