0

これはおそらく簡単な質問ですが、モデルのオブジェクトを作成しようとして苦労しています。アクションに投稿するデータに従って内部値を更新できるように、モデルと同じ一時変数を作成したいと考えています。

私のデータはコントローラーのアクションに正常に投稿されました。現在私がやっていることは、データベース内のすべてのアイテムを取得してから、配列の最初のアイテムに割り当てることです。この方法で既存の値を上書きできますが、テーブルが空の場合は機能しません。

私は Cakephp 2.x を使用しています。

コントローラーからのコードは次のとおりです。

public function lcadd()
    {
        if ($this->request->is('post'))
        {
            // Create a new Local Clock object
            $temp = $this->LocalClock->find('all'); // THIS IS THE PROBLEM AREA
            $temp = $temp[0];

            $temp['LocalClock']['name'] = $this->request->data['LocalClock']['Name'];
            debug($temp);  // THIS DEBUG ONLY DISPLAYS SOMETHING IF THE DATABASE TABLE IS NOT EMPTY

            debug($this->request->data);  // THE DATA COMING IN IS CORRECT AND I CAN ACCESS IT WITHOUT A PROBLEM

            if($this->request->data['LocalClock']['Time Zone'] == 0 or $this->request->data['LocalClock']['Time Zone'] == -1)
            {
                //debug('Hello');
                $temp['LocalClock']['auto_offset'] = 1;
            }
            else if($this->request->data['LocalClock']['Time Zone'] == 1)
            {
                $temp['LocalClock']['auto_offset'] = 0;
            }

            // Check the value posted from the DST
            if($this->request->data['LocalClock']['DST Definition'] == -1 or $this->request->data['LocalClock']['DST Definition'] == 0)
            {
                $temp['LocalClock']['in_month'] = 0;
            }
            else if($this->request->data['LocalClock']['DST Definition'] == 2)
            {
                $temp['LocalClock']['in_month'] = $this->request->data['LocalClock']['InMonth'];
            }

            if ($this->LocalClock->save($temp))
            {
                $this->set('localClocks', $this->request->data);
                $this->set('islcAddValid', true);
                $this->set('lcaddValidationErrors', false);
            }
        }
    }

モデルから単純なオブジェクトを作成する方法がわかりません。モデルは LocalClock で、コントローラーは LocalClocksController です。上記の関数は LocalClocksController にあります。

前もって感謝します。

4

1 に答える 1

1

気になった点をいくつか…

創刊:

// Create a new Local Clock object
$temp = $this->LocalClock->find('all'); // THIS IS THE PROBLEM AREA
$temp = $temp[0];

それは、新しいローカル クロック オブジェクトを作成することではありません。最初の行は、Local Clock データベース テーブルのすべてのレコードを含む配列 (つまり、オブジェクトではない) を返します。次に、2 行目に「結果の最初の行を取得し、$temp に保存する」と書かれています。したがって、$temp は、LocalClock テーブルの最初のレコードのデータを含む配列 (まだオブジェクトではありません) を保持します。

ただし、後で呼び出す「保存」メソッドはオブジェクトを受け入れないため、実際にはオブジェクトは必要ありません。データの配列を受け入れるだけです。また、新しいレコードを保存するためにデータベースから何も取得する必要はありません。したがって、上記のコードは次のように置き換える必要があります。

$temp = array(); // Create an empty array. We will populate it as we go, with the data for the new record.

レコードを保存しようとするまで、メソッドの途中にあるすべてのものは、そのままで正常に機能するはずです。

2 番目の問題:

if ($this->LocalClock->save($temp))

「保存」を呼び出す前に、まず「作成」を呼び出す必要があります -

$this->LocalClock->create(); // prepare the Model to save a new record
if ($this->LocalClock->save($temp)) // This should now save a new record successfully.

わかる?ご不明な点がございましたら、お気軽にお問い合わせください。

また、モデルからデータを取得、操作、および保存する方法を理解することは、CakePHP を使用する上で非常に重要です。最初から適切に行う方法を学べば、将来、フラストレーションを何時間も節約できます。次のページを端から端まで読むことをお勧めします。

  1. http://book.cakephp.org/2.0/en/models/retriving-your-data.html

  2. http://book.cakephp.org/2.0/en/models/ Saving-your-data.html

于 2012-07-12T23:26:42.863 に答える