Cakephp$useTable不起作用
我正在CakePHP2.2.3上开发一个web应用程序,其中已有一个数据库(MySQL)。这个数据库是西班牙语的,所以我的应用程序是西班牙语的,我得到一个错误“error:Table ordens for model orden在datasource default中找不到。” 我的模型: Orden.phpCakephp$useTable不起作用,cakephp,models,cakephp-model,cakephp-2.2,Cakephp,Models,Cakephp Model,Cakephp 2.2,我正在CakePHP2.2.3上开发一个web应用程序,其中已有一个数据库(MySQL)。这个数据库是西班牙语的,所以我的应用程序是西班牙语的,我得到一个错误“error:Table ordens for model orden在datasource default中找不到。” 我的模型: Orden.php class Orden extends AppModel{ public $name = 'Orden'; public $useTable = 'ordenes';
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/config/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
的值正确。您确定默认数据源中存在表吗?CakePHP可以使用多个数据源来处理多个连接(请参见APP/config/database.php
)
不正确,但与您的问题无关的是public$primaryKey='idorden'代码>。看看你的MySQL代码,它应该说:public$primaryKey='idOrden'代码>
你有调试模式吗?尝试在/APP/tmp/cache
中刷新缓存
可能您正在使用表前缀,而数据库中的表没有前缀
您是否复制并粘贴了错误消息?模型不太可能用大写字母书写
您还可以使用$useTable
定义单词的自定义单数和复数形式。看
但是,请查看您的数据库配置,或者向我们展示代码,让我们看看您是否正在使用多个数据源。否则,请使用mysql提示符或phpMyAdmin之类的工具检查该表是否确实存在。我找到了一个半途而废的解决方案。
检查以下代码:
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'));
}
}
如果我在OrdenesController
中设置变量$useTable
,我可以得到Ordenes数组。有人能告诉我为什么吗?我也遇到了这个问题。原因是我的php模型文件名ScheduleAd.php
,但我编写了“ScheduleAd”
用于数组
public $uses = array('ScheduleAD');
因此,请检查您的模型文件名、模型类名和$uses array中的名称是否完全相等:)您找到了问题的答案,其中有一个对您有效的部分解决方案,但实际上这是一个在任何情况下都不会起作用的变通方法
我想回答这个问题:
“如果我在OrdenesController中设置变量$useTable
,我可以得到Ordenes数组。有人能告诉我为什么吗?”
您在自己的解决方案中提出的问题(目前无法评论)
第一个重要注意事项是CakePHP抛出错误:
错误:在数据源默认值中找不到模型的表。
如果在中找不到型号
的表
数据源默认值。(明显)
但在某些情况下,如果cakePHP找不到模型
,这可能会让人非常困惑
您在模型中所做的工作之所以有效,是因为您在控制器中编写:
public $uses = array('orden');
CakePHP假定$this->order为模型,并尝试在文件夹模型中查找模型order(请注意,CakePHP将查找的文件是order.phpNOTorder.php它还希望类被调用order和NOTorder,即使您可以更改模型的类名设置$name
)
如果找到模型,它将尝试从模型的默认设置或设置中检索数据(如您的案例中的$useTable
和$primaryKey
)。
如果找不到表,则会显示错误消息,正确指示找不到表的事实
但如果没有找到模型,cakePHP会尝试实例化模型,在本例中是使用默认值,因为没有进行任何设置(模型被“动态”实例化)。这意味着它使用默认值作为数据源,并且是orden的英文复数,ordens cakePHP会尝试查找ordens表(这是cakePHP为模型命名表的标准方法,orden不是英语单词)。
由于该表不在默认数据源中,因此会抛出错误,但真正的错误是不存在的文件
当您更改模型中的$useTable
值时,您认为将使用该值而不是标准值,但cakePHP使用的不是您的模型Orden,而是“动态”实例化的模型Orden,因为它找不到错误消息sais中的模型Orden(您的类称为call Orden NOT Orden)
因此,由任何默认模型(例如find等)排序的任何默认操作都将起作用。
然后你调用$this->orden->find('all')
它会很好地工作,但是如果你在你的模型中创建任何函数(你认为你正在使用orden的函数)并调用它,你会得到一个错误,因为它们在“动态”版本中不存在
由于这个原因,您的解决方法将起作用,但只起到很小的作用。我在第一篇文章中添加了my database.php,而且正如您所说,我已删除了/APP/tmp/cache
中的文件,但错误保留了。消息“错误:在datasource default中找不到模型orden的表ordens。”是复制并粘贴在这里的。我也读过单数和复数形式,但我不明白。最后,我确信该表存在。正如前面所说,您使用的是两种不同的模型。请更正public$uses=array('orden');
topublic$uses=array('orden');
(注意大写字母O)在控制器上省去$this->orden->useTable='ordenes';
(都在控制器中),您使用的是不同的模型(“orden”,小写字母为“o”)。该模型是动态创建的。这就是为什么。将调试设置为2,并检查页面底部的SQL日志以获取线索。这不会提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您有足够的内容,您将可以