2010-06-29 3 views
2

J'ai une table simple avec 3 valeurs principe, intérêt, période. Je veux montrer ces 3 valeurs dans un tableau avec intérêt simple calculé. Cet intérêt est pour l'affichage seulement, ne sera pas stocké dans la base de données. Comment puis-je atteindre cet objectif ? Je sais que je peux utiliser Javascript pour calculer l'intérêt et le rendre, mais puis-je le faire via Cakephp?Rendu d'une valeur calculée qui ne se trouve pas dans la base de données

Répondre

1

Vous pouvez le faire dans l'instruction select SQL, quelque chose comme:

select Principle, Interest as [interest rate], Period, 
     principle * interest * period/12 as [Interest Amount] 
    from your_table 

Quand il revient à PHP, ce regardera comme vous aviez choisi à partir d'une table avec quatre colonnes au lieu de trois (c'est-à-dire que la valeur calculée ne sera pas différente des autres).

+0

Merci, mais j'ai besoin des valeurs supplémentaires qui doivent être regardé (l'exemple que je vous ai donné était très simpliste), et j'ai besoin de faire quelques conversions mathématiques, y compris la vérification des négatifs, des valeurs de plancher, etc. Ce n'est pas pratique de le faire dans la requête. Puis-je insérer une nouvelle colonne appelée Intérêt Montant dans la vue de cakephp après l'exécution de la requête? – mat

3

Quelques choses que vous pouvez faire. L'un est de le calculer dans la base de données. C'est optimal si vous pouvez le faire (IMO, je préfère pousser autant que possible la logique de données vers la base de données.) Bien sûr, si vous faites des calculs complexes et que l'évolutivité de la base de données est un problème, vous pouvez alléger la charge sur votre db en mettant cela dans le code.

L'option 2 consiste à simplement le calculer avant de l'afficher. Dans la vue, il suffit d'écrire le code PHP pour calculer ce dont vous avez besoin. Cela peut être un peu hacky, selon la fréquence à laquelle vous devez afficher ces données (calculées).

L'option 3 consiste à effectuer le même calcul dans le modèle. C'est probablement le moyen le plus Cake-y. Remplacez la méthode afterFind() de votre modèle et exécutez simplement vos calculs sur les données récupérées. Ajoutez un nouvel index de tableau selon vos besoins. Ensuite, chaque fois qu'un contrôleur/vue demande des données à partir de votre modèle, ces données seront renvoyées avec les lignes calculées. C'est probablement ainsi que je l'implémenterais.

+0

J'aime l'option 3 mais je ne comprends pas comment je peux "ajouter un nouvel index de tableau si nécessaire". Pouvez-vous élaborer s'il vous plaît? Je suis un débutant gâteau/php venant du monde j2ee – mat

+0

Pas de problème. Consultez la section du manuel sur les rappels de modèle dans le gâteau (http://book.cakephp.org/view/76/Callback-Methods). Plus précisément, regardez la méthode afterFind(). La variable $ data aura vos données récupérées (à partir de la base de données). Dans afterFind(), vous exécutez simplement vos calculs sur les champs récupérés, ajoutant ainsi vos indeces de tableau désirés (vos valeurs calculées) à la variable $ data. –

+0

Si vous utilisez Cake1.3, vous pouvez facilement utiliser les champs virtuels comme mentionné par Nik ci-dessous. –

3

Vérifiez ce lien: Virtual fields

Fondamentalement, vous pouvez définir dans vos champs virtuels de modèle et vous pouvez les utiliser comme champ régulier dans le contrôleur et la vue. Vous pouvez les utiliser aussi :) en pagination

0

De l'avis:

<?php echo $a * $b/$c ?> 

OU

Dans le contrôleur:

$calcVal = $a * $b/$c; 
$this->set('calcVal'); 

puis dans la vue:

<?php echo $calcVal ?> 

Ou l'une des options lis ci-dessus.

Pour les choses simples où j'ai les valeurs dans la vue de toute façon, j'irais avec le premier. D'un autre côté, pour un calcul complexe utilisant des valeurs pour lesquelles je n'aurais pas d'utilité dans la vue, j'irais avec la seconde.

0

http://book.cakephp.org/2.0/en/models/callback-methods.html#afterfind

class Account extends AppModel { 

    public $name = "Account"; 

    public function afterFind($results, $primary = false){ 

     parent::afterFind($results, $primary); 
     if($primary){ 
      foreach($results as $key => $value){ 
       if(isset($value[ $this->alias ])){ 
        // set the a new index for each row returned to the value of Account::__calculateSomething at the correct key 
        $results[ $key ][ $this->alias ][ 'calulated_field_name' ] = $this->__calculateSomething($results[ $key ][ $this->alias ]); 
       } 
      } 
     } 
     return $results; 
    } 
} 

Le juste faire votre agrège ou caluculations dans la fonction __calulateSomething (données $) dans le modèle de compte. Ceci est un exemple bien sûr, mais il montre comment utiliser le paramètre $ primary qui est passé au callback afterFind (ce qui signifie que afterFind est déclenché pour trouver des appels faits directement à ce modèle, et non dans le cadre d'un association.

Vous devrez peut-être vérifier le format de la matrice - je ne l'ai pas fait ici.

Questions connexes