Независимые от базы данных виртуальные поля в CakePHP - PullRequest
3 голосов
/ 06 мая 2010

В CakePHP 1.3 есть функция для виртуальных полей , но она связана с базой данных, которую вы используете. Например:

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

Это будет работать для MySQL, но не для MS SqlServer. Есть ли способ сделать эту базу данных независимой?

Я все еще нахожусь в процессе разработки приложения и все еще не уверен, какую базу данных мы будем использовать в производстве. Вот почему я хочу сохранить доступ ко всем базам данных как можно более независимым.

1 Ответ

2 голосов
/ 28 июня 2010

Вы можете измерить ваше свойство 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);
    }

Приведенный выше код был протестирован с простой находкой на одной модели. Может потребоваться дополнительное тестирование для проверки крайних случаев, связанных с родственными моделями. Готовая функциональность принадлежит поведению. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...