我正在使用已存在的数据库(MySQL)在CakePHP 2.2.3上开发一个Web应用程序。这个数据库是西班牙语,所以我的应用程序是西班牙语,我得到错误“错误:在数据源默认情况下找不到模型orden的表ordens。”
我的模特:
Orden.php
class Orden extends AppModel{
public $name = 'Orden';
public $useTable = 'ordenes';
public $primaryKey = 'idorden';
}
表:
CREATE TABLE IF NOT EXISTS `ordenes` (
`idOrden` bigint(20) NOT NULL AUTO_INCREMENT,
-- more columns --
PRIMARY KEY (`idOrden`)
)
APP /配置/ database.php中
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'USER',
'password' => 'PASS',
'database' => 'DATABASE',
'prefix' => '',
//'encoding' => 'utf8',
);
}
根据文档,我可以使用相应的表声明$ useTable,但这不起作用。有人可以帮帮我吗?
编辑:与$primaryKey
相同但变量$name
具有正确的值。
答案 0 :(得分:1)
我找到了一个半丑的解决方案。 请检查以下代码:
class OrdenesController extends AppController{
public $name = 'Orden';
public $uses = array('orden');
public $helpers = array('Html', 'Form');
public function index(){
$this->orden->useTable = 'ordenes';
$this->set('ord', $this->orden->find('all'));
}
}
如果我在$useTable
中设置变量OrdenesController
,我可以获得Ordenes数组。谁能告诉我为什么?
答案 1 :(得分:1)
您找到了问题的答案,并提供了对您有效的部分解决方案,但实际上这是一种在任何情况下都无法解决的解决方法。
我想回答这个问题:
"如果我在OrdenesController中设置变量$useTable
,我可以得到Ordenes数组。谁能告诉我为什么?"
您在自己的解决方案中询问(无法发表评论)。
第一个重要说明CakePHP抛出错误:
Error: Table <table name> for model <model name> was not found in datasource default.
<table name>
的表<model name>
datasource default。(obvously)<modelname>
,这可能会让人感到困惑。你在模型中工作的原因是因为在你的控制器中你写的是:
public $uses = array('orden');
CakePHP将$ this-&gt; order作为模型并尝试在模型文件夹中找到模型 order (请注意,CakePHP将要查找的文件是 order.php < / strong> NOT Order.php 即使您可以更改模型和类型,它也会期望该类被称为订单而不是订单 #39;类名设置$name
)。
如果找到模型,它会尝试从模型的默认设置或设置集中检索数据(如您的情况$useTable
和$primaryKey
)。
如果找不到该表,则会显示错误消息,指出它无法找到该表的事实。
但是如果它没有找到模型cakePHP尝试然后实例化模型,在这种情况下使用默认值,因为没有进行任何设置(模型被实例化&#34;飞行&#34; < / em>的)。这意味着它使用默认作为数据源,并且是 orden 的英文复数, ordens cakePHP试图找到 ordens table(这是cakePHP为模型命名表的标准方式,而orden不是英文单词)。 由于此表不在 default 数据源中,因此会抛出错误,但实际错误是不存在的文件。
当您更改模型中的$useTable
值时,您认为它将被使用而不是标准,但cakePHP不使用您的模型 Orden ,而是&#34 ;飞行&#34; 实例化模型 orden ,因为它无法找到模型 orden 作为错误消息sais(您的类是调用 Orden not orden )。
因此,任何默认模型(例如查找等)的任何默认操作都将起作用。
然后你打电话给$this->orden->find('all')
它会完美起作用,但是如果你在你的模型中创建了任何一个函数(你认为你正在使用的那个 Orden )并调用它,那么你会得到一个错误,因为他们不会#39; t存在于&#34; on fly&#34; 版本中。
因此,您的解决方法可以正常工作,但只是部分工作。
答案 2 :(得分:0)
您确定您的表存在于默认数据源中吗? CakePHP可以使用多个数据源来处理多个连接(请参阅APP/config/database.php
)
错误,但与您的问题无关,是public $primaryKey = 'idorden';
。看看你的MySQL代码,应该说:public $primaryKey = 'idOrden';
你有调试模式吗?尝试在/APP/tmp/cache
中刷新缓存。
也许您使用表前缀并且数据库中的表没有前缀?
您是否复制并粘贴了错误消息?模型不太可能用小型大写字母书写。
您还可以定义使用$useTable
无关的自定义单数和复数形式的单词。见http://book.cakephp.org/2.0/en/development/configuration.html#inflection-configuration
但请查看您的数据库配置或向我们展示代码,让我们看看您是否使用多个数据源。否则,如果表格确实存在,请使用mysql提示或phpMyAdmin等工具进行检查。
答案 3 :(得分:-1)
我也遇到了这个问题。原因是我的模型php文件名ScheduleAd.php
,但我为使用数组写了"ScheduleAD"
。
public $uses = array('ScheduleAD');
那么,请检查你的模型文件名和模型类名以及$ uses数组中的名称,它们必须完全相同:)