Вы можете измерить ваше свойство Model::virtualFields
так, чтобы оно имело правила для каждой базы данных:
var $virtualFields = array(
'mysql' => array(
'display_name' => 'CONCAT(User.name, " (", User.team, ")")',
),
'postgres' => array(
'display_name' => 'PgConcatStuff(...)',
),
'mssql' => array(
'display_name' => 'MsConcatStuff(...)',
),
);
Хитрость заключается в том, чтобы поймать вышеупомянутое свойство и управлять им на лету, чтобы Cake никогда не осознавал:
class AppModel extends Model {
function beforeFind($queryData) {
$ds = $this->getDataSource();
$db = $ds->config['driver'];
$this->virtualFields = $this->virtualFields[$db];
return parent::beforeFind($queryData);
}
Приведенный выше код был протестирован с простой находкой на одной модели. Может потребоваться дополнительное тестирование для проверки крайних случаев, связанных с родственными моделями. Готовая функциональность принадлежит поведению. :)