cakephp新领域没有保存

时间:2011-08-19 04:22:55

标签: cakephp

如何扩展cakePHP项目以便它可以在数据库中使用新字段?

我刚给了一个CakePHP项目,我试图扩展模型以包含一个新字段。我原来的开发人员已经不再可用了,我之前没有和CakePHP合作过。问题是所有其他字段都正确保存,但新字段被保存为空字符串。

数据库已扩展为包含新字段:

class_time  varchar(30)

我扩展了原始视图以支持新字段

<?=$form->input('release', array('type' => 'radio', 'legend' => false, 'div' => 'radio', 'options' => array('Agree' => 'Agree &nbsp;', 'Disagree' => 'Disagree')))?>
<?=$form->input('class_time', array('type' => 'radio', 'legend' => false, 'div' => 'radio', 'options' => array('No preference' => 'No preference&nbsp;', '6:00-8:30 P.M. ' => '6:00-8:30 P.M. ', '6:30-9:00 P.M.' => '6:30-9:00 P.M.')))?>

尽我所知,该页面正在正确呈现HTML

<div class="radio"><input type="hidden" name="data[Account][release]" id="AccountRelease_" value=""><input type="radio" name="data[Account][release]" id="AccountReleaseAgree" value="Agree"><label for="AccountReleaseAgree">Agree &nbsp;</label><input type="radio" name="data[Account][release]" id="AccountReleaseDisagree" value="Disagree"><label for="AccountReleaseDisagree">Disagree</label></div>
<div class="radio"><input type="hidden" name="data[Account][class_time]" id="AccountClassTime_" value=""><input type="radio" name="data[Account][class_time]" id="AccountClassTimeNoPreference" value="No preference"><label for="AccountClassTimeNoPreference">No preference&nbsp;</label><input type="radio" name="data[Account][class_time]" id="AccountClassTime6:00-8:30P.m." value="6:00-8:30 P.M. "><label for="AccountClassTime6:00-8:30P.m.">6:00-8:30 P.M. </label><input type="radio" name="data[Account][class_time]" id="AccountClassTime6:30-9:00P.m." value="6:30-9:00 P.M."><label for="AccountClassTime6:30-9:00P.m.">6:30-9:00 P.M.</label></div>

但是当它保存时,它会保存“release”字段(和其他字段)的选择,而不是class_time。

我可以在cakePHP文档中找到app / models / account.php,我相信我需要定义新字段,但它只包含以下内容:

<?php
  class Account extends AppModel {
    var $name = 'Account';
  }
?>

这让我想知道原始开发者是如何获得“发布”来保存的,即使它似乎没有被定义。

有什么东西我缺少,或者仍然需要做?

10 个答案:

答案 0 :(得分:59)

每当您对数据库进行任何更改时,请确保您的app/config/core.php文件调试值为2. Configure::write('debug', 2);

如果为0,则无法检测到数据库更改。

答案 1 :(得分:22)

在CakePHP应用程序中,无论何时添加新字段或修改数据库中的结构,都应删除 YourApplication / app / tmp / cache / models 文件夹中的所有文件。

答案 2 :(得分:3)

每当您进行任何数据库更改时,请按照以下步骤操作:

  1. 清除\ app \ tmp \ cache \ models
  2. 下的文件
  3. 如果您使用任何缓存引擎(如memcache),请重新启动缓存服务。
  4. 在core.php中将调试设置为2

答案 3 :(得分:2)

尝试清除缓存目录下的所有模型。

  

应用/ TMP /高速缓存/模型

答案 4 :(得分:2)

在cakephp 3中,您还应该检查该模型的实体文件,并确保该字段位于$ _accesible属性下。

示例:

protected $_accessible = [
    'name' => true,
    'topic' => true,
    'new_field' => true
];

答案 5 :(得分:1)

在/ app / tmp / cache

清除缓存

如果将调试级别提高到2或3不起作用。

检查在使用debug($ Model)时是否在模型的模式属性下显示您的新字段。

答案 6 :(得分:1)

如果数据库更改无效,您也可以删除缓存文件。

  

应用程序\ app \ tmp \ cache \ models

的路径

答案 7 :(得分:1)

过了一会儿,但我今天想在Cake 3.x中找到一种方法。最简单的方式,imo:

bin/cake orm_cache build

将使用当前的db结构重建缓存。

或者只是清除没有重建:

bin/cake orm_cache clear

http://book.cakephp.org/3.0/en/console-and-shells/orm-cache.html

答案 8 :(得分:0)

您需要通知cakephp您的数据库中有新字段。为什么需要这样做是因为coz cakephp只扫描数据库一次并生成模式。 一旦指的是第一次运行。您可以在app\tmp\cache\models中找到架构。

因此,如果清除上述文件夹中的文件,蛋糕将重新生成架构。现在有一个例外,如果你处于开发/调试模式,cakephp每次扫描它。

答案 9 :(得分:-3)

实际上,对数据库的任何更改,如果为零,您应该在app/config/core.php中将调试模式更改为2。否则它将从缓存中获取值。