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 ', 'Disagree' => 'Disagree')))?>
<?=$form->input('class_time', array('type' => 'radio', 'legend' => false, 'div' => 'radio', 'options' => array('No preference' => 'No preference ', '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 </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 </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新字段不保存的主要内容,如果未能解决你的问题,请参考以下文章