在CakePHP 1.3中,virtual fields有一个功能,但它与您正在使用的数据库相结合。例如:
var $virtualFields = array(
'full_name' => 'CONCAT(User.first_name, " ", User.last_name)'
);
这适用于MySQL,但不适用于MS SqlServer。有没有办法使这个数据库不可知?
我还在开发应用程序,但仍不确定我们将在生产中使用哪个数据库。这就是为什么我想尽可能保持所有数据库访问不可知。
答案 0 :(得分:2)
您可以标注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);
}
上面的代码在单个模型上进行了简单的查找测试。可能需要更多测试来检查涉及相关模型的边缘情况。完成的功能属于行为。 :)