Cakephp $ useTable不起作用

时间:2012-10-24 20:00:52

标签: cakephp models cakephp-appmodel cakephp-2.2

我正在使用已存在的数据库(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具有正确的值。

4 个答案:

答案 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.

  1. 如果找不到模型<table name>的表<model name> datasource default。(obvously)
  2. 但在某些情况下,如果cakePHP找不到模型<modelname>,这可能会让人感到困惑。
  3. 你在模型中工作的原因是因为在你的控制器中你写的是:

    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数组中的名称,它们必须完全相同:)