提问者:小点点

Cakephp$useTable不工作


我正在CakePHP2.2上开发一个web应用程序。3已存在数据库(MySQL)。这个数据库是西班牙语的,所以我的应用程序是西班牙语的,我得到一个错误“error:Table ordens for model orden在datasource default中找不到。”

我的模型:

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',
);

}

根据docs,我可以用相应的表声明$useTable,但这不起作用。有人能帮帮我吗?

编辑:与$primaryKey相同的问题,但变量$name的值正确。


共3个答案

匿名用户

我找到了一个半途而废的解决办法。检查以下代码:

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数组。谁能告诉我为什么?

匿名用户

你找到了你的问题的答案,有一个对你有效的部分解决方案,但事实上这是一个在任何情况下都不会起作用的变通方法。

我想回答这个问题:

“如果我在OrdenesController中设置变量$useTable,我可以得到Ordenes数组。有人能告诉我为什么吗?”

您在自己的解决方案中询问的问题(目前无法评论)

第一个重要注意事项是CakePHP抛出错误:

错误:表

  1. 如果表

您在模型中所做的工作之所以有效,是因为您在控制器中编写:

public $uses = array('orden');

CakePHP假设$this-

如果找到模型,它将尝试从模型的默认设置或设置(如您的案例中的$useTable$primaryKey)检索数据
如果找不到表,则会显示错误消息,正确指示找不到表的事实。

但如果没有找到模型,cakePHP会尝试实例化模型,在本例中是使用默认值,因为没有进行任何设置(模型是“动态”实例化的)。这意味着它使用默认值作为数据源,作为orden的英文复数,ordens cakePHP尝试查找ordens表(这是cakePHP为模型命名表的标准方法,orden不是英文单词)。由于该表不在默认数据源中,因此会抛出错误,但真正的错误是不存在的文件。

当你改变$useTable值在你的模型中,你认为它将被使用,而不是标准,但cakePHP不是使用你的模型奥登,而是“在飞”实例化模型奥登,因为它找不到模型奥登作为错误消息说(你的类是调用奥登不是奥登)。

因此,由任何默认模型(例如find等)排序的任何默认操作都将起作用
然后调用$this-

由于这个原因,您的变通方法将起作用,但仅在很大程度上起作用。

匿名用户

您确定默认数据源中存在表吗?CakePHP可以使用多个数据源来处理多个连接(请参见APP/config/database.php

不正确的,但与您的问题无关,是Public$priyKey='idorden';。看看你的MySQL代码,它应该说:Public$priyKey='idOrden';

你有调试模式吗?尝试在/APP/tmp/cache中刷新缓存。

也许您使用表前缀,而数据库中的表没有前缀?

您是否复制并粘贴了错误消息?模型不太可能用大写字母书写。

您还可以使用$useTable定义单词的自定义单数和复数形式。看见http://book.cakephp.org/2.0/en/development/configuration.html#inflection-配置

但是,请查看您的数据库配置,或者向我们展示代码,让我们看看您是否正在使用多个数据源。否则,请使用mysql提示符或phpMyAdmin等工具检查表是否确实存在。