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.
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_userst LEFT OUTER JOIN cprol_languageslanguageObj 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;
$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.