CakePHP中与数据库无关的虚拟字段

时间:2010-05-06 14:11:43

标签: cakephp

在CakePHP 1.3中,virtual fields有一个功能,但它与您正在使用的数据库相结合。例如:

var $virtualFields = array(
  'full_name' => 'CONCAT(User.first_name, " ", User.last_name)'
);

这适用于MySQL,但不适用于MS SqlServer。有没有办法使这个数据库不可知?

我还在开发应用程序,但仍不确定我们将在生产中使用哪个数据库。这就是为什么我想尽可能保持所有数据库访问不可知。

1 个答案:

答案 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);
    }

上面的代码在单个模型上进行了简单的查找测试。可能需要更多测试来检查涉及相关模型的边缘情况。完成的功能属于行为。 :)