2010-05-06 7 views
3

Dans CakePHP 1.3, il existe une fonctionnalité pour virtual fields mais elle est couplée à la base de données que vous utilisez. Par exemple:Champs virtuels agnostiques de base de données dans CakePHP

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

Ceci fonctionnerait pour MySQL mais pas pour MS SqlServer. Y at-il un moyen de rendre cette base de données agnostique?

Je suis encore en train de développer une application et je ne sais toujours pas quelle base de données nous allons utiliser en production. C'est pourquoi je veux garder tous les accès à la base de données aussi agnostique que possible.

Répondre

2

Vous pouvez dimensionner votre Model::virtualFields propriété telle qu'elle avait des règles pour chaque base de données:

var $virtualFields = array(
    'mysql' => array(
     'display_name' => 'CONCAT(User.name, " (", User.team, ")")', 
    ), 
    'postgres' => array(
     'display_name' => 'PgConcatStuff(...)', 
    ), 
    'mssql' => array(
     'display_name' => 'MsConcatStuff(...)', 
    ), 
); 

L'astuce est alors d'attraper la propriété ci-dessus et de le manipuler sur la volée si gâteau ne réalise jamais:

class AppModel extends Model { 

    function beforeFind($queryData) { 
     $ds = $this->getDataSource(); 
     $db = $ds->config['driver']; 
     $this->virtualFields = $this->virtualFields[$db]; 
     return parent::beforeFind($queryData); 
    } 

Le code ci-dessus a été testé avec une simple recherche sur un seul modèle. Plus de tests peuvent être nécessaires pour vérifier les cas limites impliquant des modèles connexes. La fonctionnalité terminée appartient à un comportement. :)

+0

Bonne idée. Au lieu de 'beforeFind',' __construct' serait probablement un meilleur endroit, d'autant plus qu'il ne doit être exécuté qu'une seule fois. +1 de toute façon. – deceze

+0

Ah, bon point. En outre, cela pourrait aller dans la méthode 'startup' d'un comportement avec les champs virtuels étant même passés en paramètres. – deizel

Questions connexes