我正在尝试在编写我的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;
}
}
答案 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)