2011-08-08 12 views
1

私は、データベース内の1人のユーザーで動作するモデルを持っています。
これは、ユーザーに小さな変更をたくさん行うように設計されているので、データベースを複数回クエリする代わりに、モデルのコンストラクタですべてのユーザーの情報を取得し、残りの部分を通じてその情報を処理することにしました(データベースを更新するのではなく、私が持っている配列を更新することになります)。次に、その配列をデストラクターのデータベースに保存し直します。Codeigniter、デストラクタにない場合はモデル保存コードをどこに実行するのですか?

これはうまくいきますが、もう少し読んできましたが、デストラクタ(データベースの更新クエリを実行している場所)でクリーンアップしないコードを実行しないでください。 。だから、私は好奇心が強い、これを行うには良い方法はありますか?私はより良い解決策を見逃していますか?

おかげで、最大

EDIT:ここに は私がやっているものの一例である(注:この例ではしかし、ショッピングカートのクラスではなく、ユーザーのクラスです):

<?php 
class cartmodel extends CI_Model 
{ 
    private $sessionPrefix = 'Cart_'; 
    private $CartCache = array(); 


    function __construct() 
    { 
     if ($this->session->userdata($this->sessionPrefix.'data') === FALSE) 
      $this->session->set_userdata($this->sessionPrefix.'data', array()); 

     $this->CartCache = $this->session->userdata($this->sessionPrefix.'data'); 

     parent::__construct(); 
    } 
    function __destruct() 
    { 
     $this->session->set_userdata($this->sessionPrefix.'data', $this->CartCache); 
    } 

    function AddItem ($id, $count) 
    { 
     if ($count == 0 || $count == '' || !is_numeric($count)) 
      return; 

     if (!isset($this->CartCache[$id])) 
      $this->CartCache[$id] = 0; //Initialize it so that += works 

     $this->CartCache[$id] += (int)$count; 
    } 
?> 
+0

モデルコードをお知らせください。 –

+1

'__destruct()'は、スクリプトから何か出力を得るまでに既に呼び出されていますが、私は何かが欠落していない限り、これがどのように見えるかを想像していませんが、達成しようとしている。いくつかのコードの例を追加してください。私はあなたが多かれ少なかれjavascriptに* rely *したくない限り、複数のクエリに悩まされていると思います。 –

+0

申し訳ありませんが、コード例を追加しました – Ben

答えて

1

することができますAddItem()メソッドでセッションデータを直接操作します。このような何か:

function AddItem ($id, $count) 
    { 
     // UPDATE CartCache VARIABLE 
     $this->CartCache = $this->session->userdata($this->sessionPrefix.'data'); 

     // YOUR CODE BELOW 
     if ($count == 0 || $count == '' || !is_numeric($count)) 
      return; 

     if (!isset($this->CartCache[$id])) 
      $this->CartCache[$id] = 0; //Initialize it so that += works 

     $this->CartCache[$id] += (int)$count; 

     // SAVE CartCache IN SESSION AGAIN 
     $this->session->set_userdata($this->sessionPrefix.'data', $this->CartCache); 
    } 

あなたは他の方法でCart_dataセッション変数を操作したい場合は、この方法で、あなたはまだそれを行うことができます。すべてのメソッドでCartCache配列を更新し、その中でデータを操作したら、セッション変数に再度保存してください。

+0

はい、私の問題を説明しました。セッションはほんの一例でした。実際の問題は、データベースでこれをやりたいのです。では、いつCartCacheをデータベースに保存しますか? – Ben

+0

私は実際にフックで問題を解決しました。しかし、アイデアをありがとう。 – Ben

+0

すべての増分変更が完了したら、セッションvar(またはその他のクラスvar)をデータベースに書き込むメソッド、たとえばflush()を記述できます。コントローラー内のコードにflush()の呼び出しを追加するだけです。 – Shivaas

関連する問題