CakePHP:如何从模型方法更新模型数据?

CakePHP:如何从模型方法更新模型数据?,php,cakephp,Php,Cakephp,在编写CakePHP应用程序时,我试图坚持使用“胖模型”方法,但目前我在尝试在我的一个模型中使用函数时遇到了困难。这是我的代码的一个稍微简化的版本 请看其中的部分,它说“这是故障开始的地方”,并注释掉了一大堆行。我不知道如何将headers信息保存到模型实例,因为我使用的是“findByID”,它返回一个数组而不是一个对象 我发现另一个线程()正在讨论数组与对象的问题。这似乎是蛋糕2.X设计的一部分,尽管我真的不明白为什么。无论如何,我不希望像在另一个线程中建议的那样找到解决方法,而是希望了解如

在编写CakePHP应用程序时,我试图坚持使用“胖模型”方法,但目前我在尝试在我的一个模型中使用函数时遇到了困难。这是我的代码的一个稍微简化的版本

请看其中的部分,它说“这是故障开始的地方”,并注释掉了一大堆行。我不知道如何将headers信息保存到模型实例,因为我使用的是“findByID”,它返回一个数组而不是一个对象

我发现另一个线程()正在讨论数组与对象的问题。这似乎是蛋糕2.X设计的一部分,尽管我真的不明白为什么。无论如何,我不希望像在另一个线程中建议的那样找到解决方法,而是希望了解如何正确地做到这一点:

// app/Model/Datareportdoc.php
App::uses('AppModel', 'Model');

class Datareportdoc extends AppModel {  

public function parseData($id) {

    $results = ""; // init
    $filepath = ""; // init

    $reportdoc = $this->findById($id);
    $filepath = $reportdoc['Datareportdoc']['filepath'];
    $headers = array(); // init

    // Parse and save the report data
    if (($handle = fopen($filepath, "r")) !== FALSE) {
        $row = 0;
        while (($datarow = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($datarow);
            // If it's a header row, create the headers array
            if ($row == 0) {
                $results .= "HEADER ROW\n";
                $dataheaders = implode(",", $datarow);
                // *** THIS IS WHERE THE TROUBLE STARTS ***
                //$this->Datareportdoc->id = $id; // NO: "Indirect modification of overloaded property"
                //$this->Datareportdoc->set('dataheaders', $dataheaders); // No, because we have an array, not an object :-(
                //$this->Datareportdoc->dataheaders = $dataheaders;
                //$this->Datareportdoc->save(); // NO: Error: Call to a member function save() on a non-object
// Also tried this, which also doesn't work
                //$reportdoc['Datareportdoc']['dataheaders'] = $dataheaders;
                //$reportdoc->save();
                $results .= "Datareportdoc dataheaders: ".$dataheaders."\n";
            } else {
                $data = array();
                $i = 0;
                foreach ($headers as $header) {
                    $data[$header] = $datarow[$i];
                    $i++;
                }
                $results .= "Got data for insert:\n".print_r($data, true)."\n\n\n";
                // @TODO: Insert the data...
            }
            $row++;
        }
        fclose($handle);
    } else {
        $results .= "fopen failed :-(<br />\n";
        //echo "fopen failed :-(<br />\n";
        //exit();
    }
    return $results;
}

}
//app/Model/Datareportdoc.php
App::使用('AppModel','Model');
类Datareportdoc扩展了AppModel{
公共函数解析数据($id){
$results=“”;//初始化
$filepath=”“;//初始化
$reportdoc=$this->findById($id);
$filepath=$reportdoc['Datareportdoc']['filepath'];
$headers=array();//初始化
//解析并保存报表数据
if($handle=fopen($filepath,“r”)!==FALSE){
$row=0;
while(($datarow=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($datarow);
//如果是标题行,则创建标题数组
如果($row==0){
$results.=“标题行\n”;
$dataheaders=内爆(“,”,$datarow);
//***问题就从这里开始***
//$this->Datareportdoc->id=$id;//否:“间接修改重载属性”
//$this->Datareportdoc->set('dataheaders',$dataheaders);//不,因为我们有一个数组,而不是一个对象:-(
//$this->Datareportdoc->dataheaders=$dataheaders;
//$this->Datareportdoc->save();//否:错误:对非对象调用成员函数save()
//我也试过这个,但也不起作用
//$reportdoc['Datareportdoc']['dataheaders']=$dataheaders;
//$reportdoc->save();
$results.=“Datareportdoc dataheaders:”.$dataheaders.“\n”;
}否则{
$data=array();
$i=0;
foreach($headers作为$header){
$data[$header]=$datarow[$i];
$i++;
}
$results.=“为插入获取数据:\n”。打印($data,true)。“\n\n\n”;
//@TODO:插入数据。。。
}
$row++;
}
fclose($handle);
}否则{
$results.=“fopen失败:-(
\n”; //echo“fopen失败:-(
\n); //退出(); } 返回$results; } }
因此,试一试:

与此相反:

//$this->Datareportdoc->id = $id;
//$this->Datareportdoc->set('dataheaders', $dataheaders); // No, because we have an array, not an object :-(
//$this->Datareportdoc->dataheaders = $dataheaders;
//$this->Datareportdoc->save();
使用以下命令:

$this->save($dataheaders);
这样做时,它在模型中每次都有效


(背景:CakePHP 2.x cookbook谈到了一点关于active record的内容……但这并不是说你是否已经习惯了其他平台,也不是说我理解这个术语。(3.0是ORM和active record,但2.x不是这样)

p.s.是的,我已经在CakePHP文档中阅读了关于保存数据的内容(),但这里给出的示例似乎只适用于控制器方法……我是否遗漏了一些真正基本和明显的内容?嗨,谢谢你的回答。但它不起作用。你的意思是我应该取消你引用的一行或多行注释,还是干脆用你建议的代码行替换它们?我尝试了后一行,错误是如下所示:“错误:在非对象上调用成员函数save()”。此外,仅仅编写save($dataheaders)并没有包含足够的信息来指示数据属于哪个字段,是吗?啊哈!无论如何,感谢您让我走上正确的轨道。这很有效:$reportdoc['Datareportdoc']['dataheaders']=$dataheaders;$This->save($reportdoc);好的。如果这行得通,那么我想你在帖子中没有提到的是你的“dataheaders”是Datareportdoc的相关模型?否则我会这样告诉你。不过,如果答案对你有帮助,如果你点击“正确答案”复选框,我会很感激,这样我会得到一些信任。;)谢谢“dataheaders”不是相关模型,而是Datareportdoc的一个属性。$reportdoc是Datareportdoc的一个实例(请参见上文:$reportdoc=$this->findById($id);)我需要将DataHeader保存到Datareportdoc模型对应的datatable中的一列中。如果您要修改答案以反映这一点,我会很高兴地单击“正确答案”。如果我按原样单击按钮,则可能会混淆其他人,因为它无法按书面形式工作。有意义吗?谢谢!:-)