如果不能通过create()清除Model :: $ id,会发生什么?

时间:2014-03-05 08:00:44

标签: cakephp cakephp-2.3

在CakePHPs博客教程中,将通过以下操作保存帖子:

public function add() 
{
    if ($this->request->is('post')) 
    {
        $this->Post->create();
        if ($this->Post->save($this->request->data)) 
        {
            $this->Session->setFlash(__('Your post has been saved.'));
            return $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash(__('Unable to add your post.'));
    }
}

我真的不明白Cookbook中描述的$this->Post->create();的目的:

  

[...]重置模型状态以保存新信息。它不是   实际上在数据库中创建一条记录,但清除了Model :: $ id [...]

(在Cookbook 2.x找到)

如果create();无法清除Model :: $ id,会发生什么?

2 个答案:

答案 0 :(得分:1)

我理解你的问题(现在)意味着:

  

我可以在此代码示例中省略创建调用:

是的,是的,你可以

Model::create将模型重置为一致状态,删除data属性并将id重置为null。

如果模型已被修改,此方法仅执行某些操作;如果模型状态没有被修改,或者它是第一个被调用的动作方法,它将不会做任何事情 - 但是当现有模型状态与下一个模型状态无关时,总是调用create是一个好习惯。模型方法调用,可以防止意外的应用程序错误。

答案 1 :(得分:0)

根据您在问题中提供的代码,您可以删除Model :: create()。它不会影响数据插入。

但是当你在循环中插入记录时,清除Model :: $ id很重要。因为如果不这样做,将只插入一条记录,并用下一条记录覆盖。

例如,

$posts = array(
    0 => array(
        'title' => "Title one"
    ),
    1 => array(
        'title' => "Title two"
    ),
    2 => array(
        'title' => "Title three"
    )
);

foreach($posts as $post) {
    $this->Post->create(); // Or you can use $this->Post->id = null;
    $this->Post->save($post);
}

如果您删除$ this-> Post-> create(),首次执行时会插入标题为“Title one”的新记录,并将最后一个插入ID设置为Model :: $ id,例如21.在第二次执行时,因为我们还没有清除Model :: $ id,它将使用标题“Title 2”更新记录,而不是将其作为新记录插入,依此类推。 最后,您将只获得一个ID为21的记录,其标题值为“Title 3”。

这只是一个例子,还有其他方法可以在没有循环的情况下保存多个记录。

希望这会有所帮助。