无法刷新行,因为缺少父级。Zend框架

12

我尝试保存时遇到了“无法刷新行,因为找不到父级”错误。这是我的代码:

abstract class Webapp_Model_Resource_Db_Table_Abstract
extends Zend_Db_Table_Abstract
{
    /**
     * Save a row to the database
     *
     *
     * @param array             $info The data to insert/update
     * @param Zend_DB_Table_Row $row Optional The row to use
     * @return mixed The primary key
     */

    public function saveRow($info, $row = null)
    {         
        if (null === $row) {
            $row = $this->createRow();
        }
        $columns = $this->info('cols');
        foreach ($columns as $column) {
            if (array_key_exists($column, $info)) {
                $row->$column = $info[$column];
            }
        }

        return $row->save();
    }
}

当我调用saveRow()方法时,我会传递$_POST的值($form->getValues())。

我已经在同一应用程序中的其他模块中重用了这个类,但是现在我遇到了这个错误,而我不确定原因。我的表格非常简单:

CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `headline` varchar(100) DEFAULT NULL,
  `snippet` varchar(500) DEFAULT NULL,
  `full_text` text,
  `author` varchar(100) DEFAULT NULL,
  `publish_from` date DEFAULT NULL COMMENT 'Publish date',
  `publish_to` date DEFAULT NULL COMMENT 'Take it down or mark as draft after this date',
  `datecreated` timestamp NULL DEFAULT NULL COMMENT 'First created on',
  `revised` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Timestamp for the last time it was revised',
  `draft` tinyint(1) DEFAULT '0' COMMENT 'Should not be published',
  `departments_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8 COMMENT='Stores news articles';

有人知道我做错了什么吗?

::::::::::::::添加内容:::::::::::::

public function saveNews($post,$defaults = array())
    {

       //get the form
        $form = $this->getForm('article' . ucfirst($validator));
        //validate
        if(!$form->isValid($post)) {
            return false;
        }


      //get fitered values
        $data = $form->getValues();
        //apply defaults
        foreach($defaults as $col => $value) {
            $data[$col] = $value;
        }

      //get the article if it exists
        $article = array_key_exists('id', $data) ?
                   $this->getNewsById($data['id']) : null;


        return $this->saveRow($data, $article);
}

1
你为什么不使用 Zend_Db_Table_Row_Abstract::save() 方法呢?在这里:http://framework.zend.com/apidoc/core/Zend_Db/Table/Zend_Db_Table_Row_Abstract.html#save - chelmertz
@chelmertz 这就是我正在使用的。看看我的类如何扩展Zend_Db_Table_Abstract。数据已成功插入数据库,但代码Zend_Db_Table_Row_Abstract :: save()也会在内部调用_refresh(),这就是我遇到错误的时候。 - browndash
我仍然不明白为什么你要使用saveRow()而不是save()。没关系,错误还在,但首先你应该删除这个,对吧?此外,在保存时,你是否设置了departments_id?可能错误出在关联上。也请发布你控制器的代码。 - Keyne Viana
但我正在使用save()。 saveRow()唯一要做的就是决定它是更新还是插入。我的控制器非常薄,它所要做的就是将post值传递给上面的模型类:这是控制器中的关键行:$this->_model->saveNews($this->_request->getPost())。已经在上面添加了saveNews。表中没有关系/外键。是的,departments_id已设置。 - browndash
你说得对,关系和departaments_id没有问题。问题在于插入行时,似乎主键未返回给_refresh方法当它调用$where = $this->_getWhereQuery()时。也许如果你打印出这个$where子句,就能看到发生了什么。你可以暂时编辑Zend_Db_Table_Row_Abstract来实现这一点。 - Keyne Viana
5个回答

12
当您传递一个空值作为主键时,Zend似乎会返回这个值而不是插入的自增值 - 即使正确创建了一个带有自增值的新行,插入的值也不会被返回。 也许您的问题与此相关。如果是这样,请在保存之前取消设置id字段。

我可以确认这是一个原因。在项目中,我使用Zend的方式略有些不同。最终,我传递了一个带有空“id”列的$array。虽然它会写入,但会返回如上所述的错误。实际上,您必须使用unset()函数来删除$array['id'],以便Zend不会抱怨。 - elb98rm

3

0

检查您的$信息数组。可能在主键中有一些空值。 因此,array_key_exists($column, $info)返回true,并将一个空的主键分配给您的行。这导致错误,因为具有此键的行不存在。

尝试

if (array_key_exists($column, $info) and $column != 'YOUR_PRIMARY_KEY_NAME') 
{
       $row->$column = $info[$column];
}

0
在我的情况下,问题是缺少AUTO_INCREMENT。

-1

你能发一下这个函数吗:

$this->getNewsById($id)

这就是你的问题所在...


我不这么认为,当我创建新行时,没有id,因此array_key_exists('id', $data)返回false,getNewsById未运行。因此$article的值= null,并传递给saveRow(),我已经检查过了。因此,我认为getNewsById的代码是无关紧要的,因为它在任何地方都没有运行。 - browndash
当您更新数据库中未找到的行(无论是插入失败还是主键设置不正确),就会出现“无法刷新行,因为缺少父项”的问题。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接