Hi, I have a question regarding CGridView and its Dataprovider.
I’m listing within a CGridView the result of a search() function that use $criteria->compare() and method $criteria->select().
The problem is that I need to compare a field that is calculated on the fly with $criteria->select() this way:
Inside Log.php Model
$criteria->select=array("*","if(t.description='', CONCAT('from ',from0.description,' to ',to0.description),t.description) as mydescription");
$criteria->compare('mydescription',$this->mydescription,true);
The compare doesn’t work since mydescription does not exist on the Log table.
Do you have $this->mydescription? If not make make a virtual attribute with getter and setter:
private $_mydescription;
public function getMydescription() {
if($this->_mydescription !== null) {
if($this->description == '') {
$this->_mydescription = //create your concat function here
} else {
$this->_mydescription = $this->description;
}
}
return $this->_mydescription;
}
public function setMydescription($desc) {
$this->_mydescription = $desc;
}
public function search() {
//...
$criteria->compare("if(t.description='', CONCAT('from ',from0.description,' to ',to0.description),t.description)", $this->mydescription, true); //look for no underscore
//...
}
Hey Gasmin, thank you very much!! I already had the mydescription so I don’t need the getter function, anyway this is something that you teach me and that I will surely use for other stuff. Instead you showed me the solution: put the “if(t.description…)” expression inside the compare() directly and not trying to bind a column!
Have a nice week end my friend and many thanks for the time you spent for me!