在Controller中创建Model的实例

时间:2012-07-12 20:02:05

标签: cakephp object model controller

这可能是一个简单的问题,但我很难尝试创建模型的对象。我想创建一个与模型相同的临时变量,以便根据我发布到操作的数据更新其内部值。

我的数据已成功发布到控制器中的操作。 目前我正在做的是抓取数据库中的所有项目,然后从数组中分配第一项。这样我就可以覆盖现有值,但是如果表是空的,它将无效。

我正在使用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中。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我注意到的一些事情......

第一个问题:

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

那不是创建一个新的本地时钟对象。第一行返回一个包含本地时钟数据库表中所有记录的数组(即非对象)。然后,第二行显示'取结果的第一行,并将其存储在$ temp'。所以,现在$ temp包含一个数组(仍然不是一个对象),包含LocalClock表中第一个记录的数据。

但实际上你不需要一个对象,因为你稍后调用的'save'方法不接受一个对象 - 它只接受一个数据数组。您也不需要从数据库中获取任何内容以保存新记录。所以上面的代码应替换为:

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

在您尝试保存记录之前,方法中间的所有内容都应该正常工作。

第二个问题:

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

在调用'save'之前,您首先需要调用'create' -

$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/retrieving-your-data.html

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