问题 由于缺少父级,因此无法刷新行。 Zend框架


当我尝试保存时,我收到错误“无法刷新行,因为父项缺失”。这是我的代码

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';

谁知道我做错了什么?

:::::::::::::: ADDTION :::::::::::::

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);
}

7248
2017-08-09 14:50


起源

你为什么不用 Zend_Db_Table_Row_Abstract::save()?这里: framework.zend.com/apidoc/core/Zend_Db/Table/... - 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。表中没有关系/ fk。是的departments_id已设置 - browndash
你是对的,没有关系和离开的东西。问题是当对行进行分类时,似乎主键在调用$ where = $ this - > _ getWhereQuery()时没有返回到_refresh方法。也许如果你打印这个$ where clausule你可以看到发生了什么。您可以使用它来临时编辑Zend_Db_Table_Row_Abstract。 - Keyne Viana


答案:


当您为主键传递空值时,Zend似乎返回此值而不是插入的自动增量值 - 即使使用自动增量值正确创建了新行,也不会返回插入的值。

也许你的问题与此有关。如果是这样,请在保存之前尝试取消设置id字段。


10
2017-09-04 21:57



谢谢,这就是诀窍 - browndash
我可以确认这是一个原因。作为项目的一部分,我以略微非标准的方式使用Zend。我最终传递了一个带有'id'列的$数组。虽然它会写,但它会返回一个错误,如上所述。你实际上必须取消设置$ array ['id']才能让Zend不要抱怨。 - elb98rm


你必须通过设置告诉DbTable有一个自动递增主键 $_sequence 要么 true 或序列名称。

15.5.4.1。使用具有自动递增键的表


3
2017-10-28 11:34





检查你的$ info数组。可能你的主键有一些空值。 因此,array_key_exists($ column,$ info)返回true,并为行指定一个空主键。这会导致错误,因为具有此键的行不存在。

尝试

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

0
2017-11-18 15:55





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


0
2017-11-24 07:42





你能发布这个功能:

$this->getNewsById($id)

有你的问题......


-1
2017-08-09 20:13



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