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

时间:2014-04-17 02:20:46

标签: php cakephp

我正在尝试在编写我的CakePHP应用程序时坚持使用“Fat Model”方法,目前我试图在我的一个模型中使用函数。这是我的代码的略微简化版本。

请参阅“这就是故障开始的地方”的部分,并注释掉一堆行。我无法弄清楚如何将标题信息保存到模型实例,因为我使用的是“findByID”,它返回一个数组而不是一个对象。

我找到另一个讨论数组与对象问题的线程(CakePHP 2.0 Object not Array)。它似乎是Cake 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;
}

}

1 个答案:

答案 0 :(得分:0)

所以请试一试:

而不是:

//$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谈到了关于活跃记录的'一点点'......但是如果你已经习惯了其他平台,那不是真的,不是我理解这个术语的意思。(3.0是ORM和活动记录,但不是2.x)