cakephp新字段不保存

Posted

技术标签:

【中文标题】cakephp新字段不保存【英文标题】:cakephp new field not saving 【发布时间】:2011-08-19 04:22:54 【问题描述】:

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

我刚刚给出了一个 CakePHP 项目,我正在尝试扩展模型以包含一个新字段。 I 原来的 Developer 不再可用,而且我以前没有使用过 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>

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

根据我在 cakePHP 文档中可以找到的内容,我认为 app/models/account.php 是我需要定义新字段的地方,但它仅包含以下内容:

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

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

有什么我遗漏的,或者还需要做的吗?

【问题讨论】:

视图和模型之间有一个Controller动作。问题可能就在那里。控制器大概在app/controllers/accounts_controller.php,试着找到里面的动作代码,贴在这里。 【参考方案1】:

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

如果是 0 则不会检测到数据库更改。

【讨论】:

该功能似乎有点神秘(恕我直言),但它就像您说的那样更新了它...感谢您的快速回复! FWIW 这是因为在生产中,Cake 缓存了数据库结构,因此它不必在每次页面加载时再次查询数据库。这很少会成为问题,因为无论如何您都应该在调试级别设置为 2 的情况下进行开发。 我建议手动删除 实时网站上的临时缓存文件,而不是养成在数据库更改时打开调试模式的习惯。打开调试模式会显示详细的错误以及数据库查询,pr() 等,这不是公众的眼睛。参考答案***.com/a/21779427/216084 我认为其他答案更好,因为如果您正在运行您的网站,您不希望向用户显示调试信息。更好的是“sudo rm app/tmp/cahe/models/*” app/config/core.php 不再存在 in CakePhp3。所以,我建议这个答案***.com/a/21779427/8719007。完美运行【参考方案2】:

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

【讨论】:

不会对直播环境有任何影响吗?【参考方案3】:

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

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

【讨论】:

【参考方案4】:

很久以后,但我今天在 Cake 3.x 中寻找一种方法来做到这一点。最简单的方法,imo:

bin/cake orm_cache build

这将使用当前的数据库结构重建缓存。

或者只清除没有重建:

bin/cake orm_cache clear

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

【讨论】:

根据文档,这是推荐的方法。更多信息:book.cakephp.org/3.0/en/… 这就是解决我的问题的原因。谢谢你,@BSounder。【参考方案5】:

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

app/tmp/cache/models

【讨论】:

【参考方案6】:

清除 /app/tmp/cache 的缓存

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

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

【讨论】:

【参考方案7】:

如果您的数据库更改不起作用,您也可以删除缓存文件。

您的应用程序的路径\app\tmp\cache\models

【讨论】:

【参考方案8】:

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

例子:

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

【讨论】:

你拯救了这一天。【参考方案9】:

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

所以如果你清除上面文件夹中的文件 cake 将重新生成架构。现在有一个例外,如果您处于开发/调试模式 cakephp 每次都会扫描它。

【讨论】:

【参考方案10】:

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

【讨论】:

-1:将调试模式设置为非零会清除缓存。你的解决方案会奏效,但你的推理是错误的。此外,不建议将调试模式设置为非零数字用于实时网站,因为它会暴露详细的错误消息和数据库查询。对于实时网站,请参阅***.com/a/21779427/216084

以上是关于cakephp新字段不保存的主要内容,如果未能解决你的问题,请参考以下文章

在 CakePHP 中保存新的关联记录

Cakephp:选择登录后要保存的数据

CakePHP:向表单添加字段(动态)

CakePHP SaveMany 不保存

CakePHP 3.0 保存我的关联数据

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?