2012-04-28 4 views
1

どこにも書かれていませんので、私の親愛なるケーキ食べる人に尋ねます。私は$Model->data配列への変更を読み書きBehaviorのBeforeSaveコールバックでModelを使ってクエリを実行するのは安全ですか?

インサイドCakePHPのBehavior::BeforeSave(&$Model)方法。私が終了する前に、データベースから他のレコードを読み込む必要があります。私が$Model->find()を使用すると、保存しようとしているモデル内の現在のデータが上書きされてしまうのではないかと心配です。

Model::find()関数は、ソースコードを表示すると、明らかに変数Model::$idをリセットします。これは、フィールドが更新されているかどうかを確認するために後で使用する変数と同じです。

<?php 
    class UniqueBehavior extends ModelBehavior { 

     function beforeSave(&$Model){ 

      $value = $Model->data[$Model->alias]['unique_field']; 
      $query = array('conditions' => array('unique_field' => $value)); 
      if ($Model->find('first', $query){ 
       // Does $Model::find() reset the internal $Model->data array? 
       $Model->data[$Model->alias]['unique_field'] = "..." 
       //... some other code here 
      } 

      //ALSO... 
      if ($Model->exists()) // Returns true if a record with the currently set ID exists. 
      $slug = $Model->field('slug'); 

      // this should fetch the slug of the currently updated Model::id from the database 
      // if I do find()'s, can I trust that the record I'm getting is the right one? 
     } 
    } 
?> 

答えて

1
あなたは常に$ tmpに現在のIDを格納し、あなたが

$tmp = $Model->id; 
// ... 
$Model->id = $tmp; 

あなたはドンこの方法で終了した後、モデルに戻って、この保存されたIDを割り当てることができ

」:ここで

は一例ですモデルIDを使用して問題に遭遇することはありません。

保存するかどうかは、モデルの作業方法によって異なります。 私は - 例えば - このIDに決して依存しません。私はいつもidをモデルに手動で割り当てます。更新や削除などの前に、モデルを手動で割り当てます。しかしこれはもちろん必要ありません。あなたはもっと注意しなければなりません。

+0

$ Model-> dataプロパティとは何ですか?私は一時的な配列にも保存する必要がありますか? –

+1

でも修正されているとおそらく賢いでしょう – mark

+0

意味があります。ケーキのドキュメントは、スコープ、リファレンス、リクエストデータ、コールバックについて少し不足しています。 MVCの構造を理解するために、多くのコアコードを掘り下げなければなりませんでした。 –

関連する問題