如何扩展cakePHP项目以便它可以在数据库中使用新字段?
我刚给了一个CakePHP项目,我试图扩展模型以包含一个新字段。我原来的开发人员已经不再可用了,我之前没有和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>
但是当它保存时,它会保存“release”字段(和其他字段)的选择,而不是class_time。
我可以在cakePHP文档中找到app / models / account.php,我相信我需要定义新字段,但它只包含以下内容:
<?php
class Account extends AppModel {
var $name = 'Account';
}
?>
这让我想知道原始开发者是如何获得“发布”来保存的,即使它似乎没有被定义。
有什么东西我缺少,或者仍然需要做?
答案 0 :(得分:59)
每当您对数据库进行任何更改时,请确保您的app/config/core.php
文件调试值为2. Configure::write('debug', 2);
如果为0,则无法检测到数据库更改。
答案 1 :(得分:22)
在CakePHP应用程序中,无论何时添加新字段或修改数据库中的结构,都应删除 YourApplication / app / tmp / cache / models 文件夹中的所有文件。
答案 2 :(得分:3)
每当您进行任何数据库更改时,请按照以下步骤操作:
答案 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。否则它将从缓存中获取值。