2015-10-09 1 views
1

Propel/PHP/Mysql question pour vous. J'ai une boîte de recherche qui va chercher des noms dans une table. J'ai besoin de concatuer 2 champs, first_name et last_name, et de faire une chaîne% LIKE% soumise. Tout à propel.Concat (2 champs) LIKE soumis valeur en utilisant Propel/Mysql/PHP

C'est ce que j'ai actuellement:

 $custQuery = CustomerQuery::create() 
      ->withColumn("CONCAT(first_name, ' ', last_name)", "full_name") 
      ->where("full_name LIKE %?%", $nameInput); 

Cela donne à l'erreur:

Cannot determine the column to bind to the parameter in clause "full_name = ?". 

Il est évident que je ne peux pas utiliser la colonne virtuelle dans la déclaration où. Lorsque j'essaie de faire la concat à l'intérieur de l'instruction where, j'obtiens la même erreur.

 $custQuery = CustomersQuery::create() 
      ->where("CONCAT(first_name, ' ', last_name) LIKE %?%", $searchStr); 

Je préfère éviter de le faire sans paramètres:

 $custQuery = CustomersQuery::create() 
      ->where("CONCAT(first_name, ' ', last_name) LIKE %$searchStr%"); 

Il fonctionne, mais je suis à la recherche d'une méthode plus orientée Propel de le faire. Y a-t-il un moyen de le faire sans une instruction where du tout?

Merci beaucoup!

+0

Je ne sais pas propel mais comme mysql est préoccupant SELECT CONCAT (prénom, "", nom de famille) AS full_name FROM nomtable; Il vous renverra le nom concaténé. –

+0

La dernière requête que j'ai posté est celle sans le "AS". J'utilise cela, et cela fonctionne. Je préfère utiliser la propulsion réelle pour le faire si possible. –

+0

Oui, vous n'utilisez pas 'As' car Propel le fait pour vous. Comme vous avez envoyé full_name comme paramètre à withColumn() –

Répondre

1

Vous devez utiliser des noms de pseudo-colonnes. Donc, si votre méthode de filtrage normal pour la colonne customers.first_name est ->filterByFirstName(), alors lorsque vous utilisez une méthode ->where() ou une méthode ->condition(), vous devez également utiliser le pseudo nom de colonne "FirstName" au lieu de "first_name".

Ainsi, votre requête problème:

$custQuery = CustomersQuery::create() 
      ->where("CONCAT(first_name, ' ', last_name) LIKE %?%", $searchStr); 

deviendrait:

$custQuery = CustomersQuery::create() 
      ->where("CONCAT(Customers.FirstName, ' ', Customers.LastName) LIKE ?", '%'.$searchStr.'%'); 

J'ai ajouté le nom de la table là-bas pour vous aussi pour faire bonne mesure, et vous devez faire le pourcentage partie des signes du paramètre au lieu d'une partie de l'instruction de requête.