3.7.10.2 Using virtual fields
Creating virtual fields is straightforward and easy, interacting with virtual fields can be done through a few different methods.
Model::hasField()
Model::hasField() has been updated so that it can return true if the model has a virtualField with the correct name. By setting the second parameter of hasField to true, virtualFields will also be checked when checking if a model has a field. Using the example field above,
$this->User->hasField('name'); // Will return false, as there is no concrete field called name
$this->User->hasField('name', true); // Will return true as there is a virtual field called name
$this->User->hasField('name'); // Will return false, as there is no concrete field called name$this->User->hasField('name', true); // Will return true as there is a virtual field called name
Model::isVirtualField()
This method can be used to check if a field/column is a virtual field or a concrete field. Will return true if the column is virtual.
$this->User->isVirtualField('name'); //true
$this->User->isVirtualField('first_name'); //false
$this->User->isVirtualField('name'); //true$this->User->isVirtualField('first_name'); //false
Model::getVirtualField()
This method can be used to access the SQL expression that comprises a virtual field. If no argument is supplied it will return all virtual fields in a Model.
$this->User->getVirtualField('name'); //returns 'CONCAT(User.first_name, ' ', User.last_name)'
$this->User->getVirtualField('name'); //returns 'CONCAT(User.first_name, ' ', User.last_name)'
Model::find() and virtual fields
As stated earlier Model::find() will treat virtual
fields much like any other field in a model. The value of a virtual
field will be placed under the model's key in the resultset. Unlike
the behavior of calculated fields in 1.2
$results = $this->User->find('first');
// results contains the following
array(
'User' => array(
'first_name' => 'Mark',
'last_name' => 'Story',
'name' => 'Mark Story',
//more fields.
)
);
$results = $this->User->find('first');// results contains the followingarray('User' => array('first_name' => 'Mark','last_name' => 'Story','name' => 'Mark Story',//more fields.));
Pagination and virtual fields
Since virtual fields behave much like regular fields when doing
find's, Controller::paginate() has been updated to
allow sorting by virtual fields.


























