[Risolto] Admin View: Un Unico Textbox Per La Ricerca In Or Su Multipli Campi

Mi han chiesto di realizzare, OLTRE al filtro avanzato, anche un filtro che abbia una unica textbox, ma che poi effettui il search in OR su piu cambi.

Immaginiamo, ma non è questo il caso, di avere nome, cognome, indirizzo, razza del cane, in campi separati. L’utente deve poter cercare ‘giulio’ o ‘labrador’ tramite quell’unica textbox… è possibile una cosa del genere!?

La sql sarà " … WHERE nome LIKE ‘%giulio%’ OR cognome LIKE ‘%giulio%’ OR razza LIKE ‘%giulio%’ OR … "

ovviamente il tutto case insensitive, ma questo credo lo faccia già mysql

Questo filtro verrà mostrato come predefinito, e sarà in una view diversa rispetto al filtro avanzato _search, in quanto solo uno dei due per volta potrà essere usato. Il che non fa una piega.

Aggiungi una proprieta’ al model


public $text_search;



Mettilo fra i safe attribute per la search e scrivi la condition:


$criteria=>addCondition("(nome LIKE '%:nome%' OR cognome LIKE '%:nome%' OR razza LIKE '%:nome%' )");

$criteria->params[':nome']=$this->text_search;

Oltre ovviamente a mettere la textbox da qualche parte.

Spero vivamente per voi che le tabelle siano piccole, perche’ se sperate di trovare qualcosa in questo millenio cercando fra migliaia di record con like ho brutte notizie per voi.

Nel caso di ricerche su grandi dati, usate sphinx.

mi da zero risultati dopo aver provato ad eseguire questa SQL, si noti il parametro NON sostituito

SELECT COUNT(DISTINCT t.id) FROM cprol_users t LEFT OUTER JOIN cprol_languages languageObj ON (t.languageId=languageObj.id) WHERE ((username != ‘root’ ) AND ((username LIKE ‘%:freeSearch%’ OR realname LIKE ‘%:freeSearch%’ OR email LIKE ‘%:freeSearch%’ )))




$criteria->addCondition("(username LIKE '%:freeSearch%' OR realname LIKE '%:freeSearch%' OR email LIKE '%:freeSearch%' )");

$criteria->params[':freeSearch']=$this->freeSearch;



Non dovresti usare mai $_GET nei model, usa if ($this->freeSearch)

Magari il bottone cerca manda anche la freesearch vuota e ti causa qualche problema.

Devi fare cosi’:


$criteria->addCondition("(username LIKE :freeSearch OR realname LIKE :freeSearch OR email LIKE :freeSearch)");

$criteria->params[':freeSearch']='%'.$this->freeSearch.'%';

Mettere i percenti nel param e non nella condition, non ci ho pensato prima.

Questo va a meraviglia ! Grazie